传播更改通知的复合视图模型

时间:2012-05-23 00:22:01

标签: c# mvvm inotifypropertychanged

我有一个名为 OperatingViewModel 的视图模型,其中包含对 LevelAListViewModel 的引用。每个级别视图模型都表示底层模型中的层次结构。我的问题是,通知 OperatingViewModel 更改任何Level [*] ViewModel的最佳方法是什么?

我已经尝试在父级中收听 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"); 
       } 
   }
}

1 个答案:

答案 0 :(得分:2)

这四种最常见的方法是:

  1. 聆听孩子的PropertyChanged事件
  2. 将引用传递给父级,然后在父级
  3. 上调用方法
  4. 将lambda传递给调用父
  5. 上的方法的子项
  6. 使用松散耦合的EventAggregator在父订阅的子项中发布PropertyChanged事件。有关示例,请参阅Prism的EventAggregator。
  7. 我通常会选择1或3,始终牢记由于强引用而导致内存泄漏的可能性。如果父母实际上提到了孩子,那么4就是矫枉过正。