【问题标题】:Composite view models propagating change notifications传播更改通知的复合视图模型
【发布时间】:2012-05-23 00:22:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# mvvm inotifypropertychanged


    【解决方案1】:

    执行此操作的四种最常见方法是:

    1. 监听孩子的 PropertyChanged 事件
    2. 将引用传递给父级,然后在父级上调用方法
    3. 将 lambda 传递给调用父级方法的子级
    4. 使用松散耦合的 EventAggregator 在子级中发布 PropertyChanged 事件,父级订阅该事件。有关示例,请参见 Prism 的 EventAggregator。

    我通常会选择 1 或 3,始终牢记这两种方法都可能由于强引用而导致内存泄漏。如果父级实际上有对子级的引用,则 4 是矫枉过正的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 2012-11-14
      • 2014-10-06
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2020-05-23
      • 2012-09-02
      相关资源
      最近更新 更多