2

LevelAListViewModelへの参照を含むOperatingViewModelというビューモデルがあります。各レベルビューモデルは、基になるモデルの階層を表します。私の質問は、 Level [*]ViewModelsのいずれかへの変更をOperatingViewModelに通知するための最良の方法は何ですか?

親でPropertyChangedイベントをリッスンしようとしましたが、問題なく動作しますが、あまりクリーンではないようです。

また、親を子への参照として渡してから、メソッドを呼び出して、チェーンの上位にある親を呼び出すことも試みましたが、これも悪いようです。

class OperatingViewModel : INotifyPropertyChanged
{
   LevelAListViewModel LevelACollection { get; set; }
}

class LevelAListViewModel : INotifyPropertyChanged
{
   LevelAList _model;
   LevelBListViewModel LevelBListViewModel { get; set; }
}

class LevelAViewModel : INotifyPropertyChanged
{
   LevelB _model;
   LevelBListViewModel LevelBListViewModel { get; set; }
}

class LevelBListViewModel : INotifyPropertyChanged
{
   LevelBList _model;
   ObservableCollection<LevelBViewModel> LevelBCollection { get; set; }
}

class LevelBViewModel : INotifyPropertyChanged
{
   LevelB _model;
   LevelCListViewModel LevelCListViewModel { get; set; }
}

class LevelCListViewModel : INotifyPropertyChanged
{
   LevelCList _model;
   ObservableCollection<LevelCViewModel> LevelCCollection { get; set; }
}

class LevelCViewModel : INotifyPropertyChanged
{
   LevelC _model;
   LevelDListViewModel LevelDListViewModel { get; set; }

   DateTime StartDate
   { 
       get { return _model.StartDate } 
       set 
       { 
           _model.StartDate = value; 
           OnPropertyChanged("StartDate"); 
       } 
   }

   DateTime EndDate 
   { 
       get { return _model.EndDate } 
       set 
       { 
           _model.EndDate = value;
           OnPropertyChanged("EndDate"); 
       } 
   }
}

class LevelDListViewModel : INotifyPropertyChanged
{
   LevelD _model;
   ObservableCollection<LevelDViewModel> LevelDCollection { get; set; }
}

class LevelDViewModel : INotifyPropertyChanged
{
   LevelD _model;    
   int Price
   { 
       get { return _model.Price} 
       set 
       { 
           _model.Price = value; 
           OnPropertyChanged("Price"); 
       } 
   }
}
4

1 に答える 1

2

これを行う最も一般的な 4 つの方法は次のとおりです。

  1. 子の PropertyChanged イベントをリッスンする
  2. 親への参照を渡し、親でメソッドを呼び出す
  3. 親のメソッドを呼び出すラムダを子に渡す
  4. 疎結合の EventAggregator を使用して、親がサブスクライブする子で PropertyChanged イベントを発行します。例については、Prism の EventAggregator を参照してください。

通常は 1 か 3 のどちらかを選択しますが、どちらも強力な参照によってメモリ リークが発生する可能性があることを常に念頭に置いています。親が実際に子への参照を持っている場合、4はやり過ぎです。

于 2012-05-23T10:12:57.610 に答える