2011-02-15 12 views
5

MVVW modelinde yepyeni biriyim, bu yüzden çok basit bir soru sorduğumda beni affetmelisin.Bir olay, bir ViewModel'den MVVW'deki başka bir ViewModel'e nasıl yayılır?

İki ViewModeli var, onlara TreeViewViewModel ve ListViewViewModel diyoruz. TreeViewViewModel, görünümünde bir IsSelected özelliğine bağlanır. IsSelected değiştiğinde, onun görünümünü güncelleyebilmesi için ListViewViewModel'i bilgilendirmem gerekiyor.

Online araştırmadan sonra, EventAggregator'a rastladım ve iyi bir çözüm olabilir.

Bu doğru çözüm mü? Eğer öyleyse, bunu uygulamak için nasıl gitmeliyim? Ya da düşünmem gereken daha iyi bir çözüm var mı? Aşağıda, EventAggregator'ın olayı yayınlayan ViewModel'e nasıl entegre olabileceğini düşündüğümün basitleştirilmiş bir sürümüdür.

public class TreeViewViewModel : INotifyPropertyChanged 
{ 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      if (value == _isSelected) 
       return; 

      _isSelected = value; 

      OnPropertyChanged("IsSelected"); 

      // Is this sane? 
      _eventAggregator.GetEvent<TreeViewItemSelectedEvent>().Publish(value); 
     } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

cevap

3

Kesinlikle bir olay toplayıcısı kullanabilir, ancak bu kadar basit bir şey için, gerek de yok. ListViewViewModel'u TreeViewViewModel.PropertyChanged dinleyebilirsiniz.

+0

Bu iki Görüntüleme Modelleri arasında doğrudan bir başvuru oluşturacağından değil mi? MVVW konusundaki anlayışım, bunun şiddetle tavsiye edilmediğidir ... ancak çerçeve kurallarına sıkı sıkıya bağlı kalmanın bazen fayda sağlamadığı için fazladan iş yarattığını kabul ediyorum. – Nathanael

+0

Bunun şiddetle tavsiye edildiği fikrini nereden aldınız? Görünüm modelleri arasında bir ilişki varsa, birbirleri için referanslar bulundurmaları oldukça mantıklıdır. Örneğin, http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090016 adresindeki MainWindowViewModel ve WorkspaceViewModel arasındaki ilişkiyi inceleyin. –