2012-02-01 32 views
1

我有一個包含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

回答

0

數據應該是持久的。確保每次更改CurrentView時都不要創建新的ViewModels。

1

應該已經張貼了我的AView XAML - 裏面是

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

所以看起來我是愚蠢的XAML中,每次我改變了看法裏面創建一個新的視圖模型。感謝大家指點我正確的方向。我從Xaml中刪除了這個,現在一切正常。

+0

我已經遷移到使用DataTemplates從ViewModels創建視圖,但是每次更改當前視圖模型時,都會調用該視圖模型的無參數構造函數。我沒有意識到這是因爲我像你指出的那樣設置了我的觀點的DataContext。這是我一直在尋找堆棧溢出的答案! – 2017-10-09 12:46:41