2011-02-15 16 views
5

Soy nuevo en el patrón de MVVW, así que tendrás que perdonarme si hago una pregunta muy básica.¿Cómo se deben propagar eventos desde un ViewModel a otro ViewModel en MVVW?

Tengo dos ViewModels, los llamaremos TreeViewViewModel y ListViewViewModel. TreeViewViewModel se une a una propiedad IsSelected en su vista. Cada vez que IsSelected cambia, necesito informar a ListViewViewModel para que pueda actualizar su vista.

Después de algunas investigaciones en línea, me encontré con el EventAggregator que parece que podría ser una buena solución.

¿Es esta la solución correcta? Si es así, ¿cómo debo implementar esto? O, ¿hay una mejor solución que debería considerar? A continuación se muestra una versión simplificada de cómo creo que EventAggregator podría integrarse en ViewModel publicando el evento.

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)); 
     } 
    } 
} 

Respuesta

3

Por supuesto que puede utilizar un agregador evento, pero no se necesita uno para algo tan simple como esto. Simplemente puede tener ListViewViewModel escuchar TreeViewViewModel.PropertyChanged.

+0

Esto crearía una referencia directa entre dos Visualización de modelos no es así? Mi comprensión de MVVW es que esto se desaconseja fuertemente ... pero reconozco que el estricto cumplimiento de las directrices marco a veces crea trabajo adicional sin ningún beneficio. – Nathanael

+0

¿De dónde sacaste la idea de que esto se desaconseja rotundamente? Si existe una relación entre los modelos de vista, es perfectamente sensato que tengan referencias entre ellos. Ver, por ejemplo, la relación entre MainWindowViewModel y WorkspaceViewModel en http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090016. –

Cuestiones relacionadas