【问题标题】:Persisting Data Between MVVM View Changes在 MVVM 视图更改之间持久化数据
【发布时间】:2012-02-01 18:57:11
【问题描述】:

我有一个包含视图/视图模型层次结构的应用程序。

ViewModelBase 包含两个 ViewModel

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

【问题讨论】:

  • 由于您没有处理AViewModel,而是通过双向绑定绑定到名为Test 的字符串,因此数据应该已经被持久化。也许在AViewModel.Testset 方法中添加一个断点,并确保该值实际上已被设置。还要添加一个断点来更改 CurrentView 并确保 AViewModel.Test 仍然设置。
  • 同意 rachel,除非您的 _aViewModel 和 _bViewModel 超出范围,否则数据将保留在内存中。
  • 当我在 AViewmodel(设置测试)中添加断点但未在 ViewModelBase 中传回 CurrentView 时,该值仍然存在 - 我可以通过 Mediator 将值返回给 ViewModelBase,但是下次我设置“currentView”时,这又会丢失 - 我假设我每次都在创建一个新的视图模型,但不确定如何简单地传递引用。

标签: wpf mvvm


【解决方案1】:

应该发布我的 AView xaml - 里面是

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

因此,每次更改视图时,我似乎都在愚蠢地在 Xaml 中创建一个新的 ViewModel。感谢大家为我指明正确的方向。我从 Xaml 中删除了它,现在一切正常。

【讨论】:

  • 我已经迁移到使用 DataTemplates 从我的 ViewModels 创建视图,但是每次我更改当前视图模型时,都会调用该视图模型的无参数构造函数。我没有意识到这是因为我正在设置我的视图的 DataContext ,就像你指出的那样。这是我一直在寻找堆栈溢出的答案!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 2014-04-10
    • 2016-01-29
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多