在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
数据应该是持久的。确保每次更改CurrentView时都不要创建新的ViewModels。
应该已经张贴了我的AView XAML - 里面是
<UserControl.DataContext>
<vm:AViewModel></vm:AViewModel>
</UserControl.DataContext>
所以看起来我是愚蠢的XAML中,每次我改变了看法里面创建一个新的视图模型。感谢大家指点我正确的方向。我从Xaml中删除了这个,现在一切正常。
我已经迁移到使用DataTemplates从ViewModels创建视图,但是每次更改当前视图模型时,都会调用该视图模型的无参数构造函数。我没有意识到这是因为我像你指出的那样设置了我的观点的DataContext。这是我一直在寻找堆栈溢出的答案! – 2017-10-09 12:46:41
由于您没有配置'AViewModel',并且使用双向绑定绑定到名为'Test'的字符串,所以数据应该已经保存了。也许在'AViewModel.Test'的'set'方法中添加一个断点并确保该值实际上已被设置。还要在更改'CurrentView'并确保'AViewModel.Test'仍然设置的位置添加一个断点。 – Rachel 2012-02-01 19:05:17
与rachel一致,除非您的_aViewModel和_bViewModel超出范围,数据将保留在内存中。 – Anton 2012-02-01 22:19:47
当我在AViewmodel(Set Test)中添加断点时,该值仍然存在,但未在ViewModelBase中传回给CurrentView - 我可以通过Mediator将值发回给ViewModelBase,但是下次再次丢失我设置了“currentView” - 我认为我每次都创建一个新的视图模型,但不知道如何简单地传递一个引用。 – Oli 2012-02-01 22:27:18