2012-02-01 8 views
1

ビュー/ビューモデルの階層を含むアプリケーションがあります。MVVMビューの変更間のデータの永続化

ViewModelBaseが2つのviewmodels

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

私のXAMLは

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

へのDataControlを結合し、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

+0

はrachelに同意しますが、_aViewModelおよび_bViewModelが有効範囲外になっている場合を除き、データはメモリ内に残ります。 – Anton

+0

AViewmodel(Set Test)にブレークポイントを追加しても、ViewModelBaseのCurrentViewには戻されません。値を取り戻すMediatorによってViewModelBaseに値を取得できますが、これもまた次回に失われます。私は "currentView"を設定しました - 毎回新しいビューモデルを作成していますが、単純に参照を渡す方法はわかりません。 – Oli

答えて

0

データを永続化する必要があります。 CurrentViewを変更するたびに、新しいViewModelを作成しないようにしてください。

1

は私のAViewのXAMLを掲載している必要があります - それは

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

た内部だから、私はビューを変更し、私は愚かなXAML毎回の内側に新しいビューモデルを作成した表示されます。私に正しい方向を向ける皆様、ありがとうございます。私はXamlからこれを削除して、すべて正常に動作しています。

+0

DataTemplatesを使用してViewModelsからViewsを作成するように移行しましたが、現在のビューモデルを変更するたびに、そのビューモデルのパラメータのないコンストラクタが呼び出されます。あなたが指摘したように私のビューのDataContextを設定していたので、私はそれがわからなかった。これは私がスタックオーバーフローのすべてを探していた答えです! –

関連する問題