2012-05-23 2 views
2

У меня есть модель вида OperatingViewModel, содержащая ссылку на LevelAListViewModel. Каждая из моделей уровня представления представляет иерархию в базовой модели. Мой вопрос: каким образом можно уведомить об изменениях в какой-либо из 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"); 
     } 
    } 
} 

ответ

2

четыре наиболее распространенными способов сделать это является:

  1. Слушая ребенок PropertyChanged события
  2. Passing ссылки на родитель, а затем вызывает метод родительского
  3. Передача лямбда детям, которые вызывают метод на родительском
  4. Использование слабосвязанного EventAggregator для публикации события PropertyChanged в дочернем элементе, которому принадлежит родительский элемент выписывает. См. Пример EventAggregator Prism.

Обычно я выбираю 1 или 3, всегда имея в виду потенциал для того, чтобы вызвать утечку памяти из-за сильной ссылки. 4 является излишним, если у материка есть ссылка на ребенка.