在MVVM查看更改之间保留数据

问题描述:

我有一个包含View/Viewmodels层次结构的应用程序。在MVVM查看更改之间保留数据

ViewModelBase包含两个的ViewModels

private AViewModel _aViewModel = new AViewModel(); 
private BViewModel _bViewModel = new AViewModel(); 

我的XAML绑定一个DataControl上以

private ViewModelBase _currentView {get; set;} 
    public ViewModelBase CurrentView 
    { 
     get 
     { 
      return _currentView; 
     } 
     set 
     { 
      _currentView = value; 
      RaisePropertyChanged("CurrentView"); 
     } 
    } 

,并决定哪个视图基于的DataTemplates显示

<DataTemplate DataType="{x:Type vm:AViewModel}"> 
    <vw:AView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type vm:BViewModel}"> 
    <vw:BView /> 
</DataTemplate> 

这一切工作正常,但我不知道如何在查看更改之间保留数据。举个例子,AViewModel包含一个名为“Test”的字符串,并且在AView中有一个双向绑定。通过使用CurrentView = _bviewmodel改变视图,当我改回到_aviewmodel时,我的数据将不会持续 - 确保任何数据保持在视图更改之间的最佳方式是什么,而不是每次创建新的空白视图模型。 我必须获取_currentView到_aViewModel,然后返回到_currentView

+0

由于您没有配置'AViewModel',并且使用双向绑定绑定到名为'Test'的字符串,所以数据应该已经保存了。也许在'AViewModel.Test'的'set'方法中添加一个断点并确保该值实际上已被设置。还要在更改'CurrentView'并确保'AViewModel.Test'仍然设置的位置添加一个断点。 – Rachel 2012-02-01 19:05:17

+0

与rachel一致,除非您的_aViewModel和_bViewModel超出范围,数据将保留在内存中。 – Anton 2012-02-01 22:19:47

+0

当我在AViewmodel(Set Test)中添加断点时,该值仍然存在,但未在ViewModelBase中传回给CurrentView - 我可以通过Mediator将值发回给ViewModelBase,但是下次再次丢失我设置了“currentView” - 我认为我每次都创建一个新的视图模型,但不知道如何简单地传递一个引用。 – Oli 2012-02-01 22:27:18

数据应该是持久的。确保每次更改CurrentView时都不要创建新的ViewModels。

应该已经张贴了我的AView XAML - 里面是

<UserControl.DataContext> 
    <vm:AViewModel></vm:AViewModel> 
</UserControl.DataContext> 

所以看起来我是愚蠢的XAML中,每次我改变了看法里面创建一个新的视图模型。感谢大家指点我正确的方向。我从Xaml中删除了这个,现在一切正常。

+0

我已经迁移到使用DataTemplates从ViewModels创建视图,但是每次更改当前视图模型时,都会调用该视图模型的无参数构造函数。我没有意识到这是因为我像你指出的那样设置了我的观点的DataContext。这是我一直在寻找堆栈溢出的答案! – 2017-10-09 12:46:41