两个视图模型之间的通信

我是MVVM设计模式的新手,我有这些视图模型:

ClassAViewModel

 public class ClassAViewModel : INotifyPropertyChanged { private int _nbre = 0; public int Nbre { get { return _nbre; } set { _nbre = value; PropertyChanged(this, new PropertyChangedEventArgs("Nbre")); } } #region Events public event PropertyChangedEventHandler PropertyChanged; #endregion } 

ClassBViewModel

  PUBLIC class ClassBViewModel: INotifyPropertyChanged { private Boolean _IsBiggerthanFive = false; public bool IsBiggerthanFive { get { return _IsBiggerthanFive; } set { _IsBiggerthanFive = value; PropertyChanged(this, new PropertyChangedEventArgs("IsBiggerthanFive")); } } #region Events public event PropertyChangedEventHandler PropertyChanged; #endregion } 

我需要知道两个视图模型之间是否存在通知的机制,即在我的情况下,如果第一个视图模型中的_nbre > 5 ,则将通知第二个视图模型, _IsBiggerthanFive将更改_IsBiggerthanFive的值。 所以:

  1. 两个视图模型如何在它们之间进行通信而没有另一个视图模型?
  2. 完成此任务的最佳方法是什么?

我同意其他评论者认为调解员/ pub-sub / event聚合器/信使是一个很好的方法。 如果您没有使用带有内置解决方案的MVVM框架,那么我建议使用这种利用Reactive扩展的简单方法 :

 public class EventPublisher : IEventPublisher { private readonly ConcurrentDictionary subjects = new ConcurrentDictionary(); public IObservable GetEvent() { var subject = (ISubject) subjects.GetOrAdd(typeof (TEvent), t => new Subject()); return subject.AsObservable(); } public void Publish(TEvent sampleEvent) { object subject; if (subjects.TryGetValue(typeof(TEvent), out subject)) { ((ISubject)subject) .OnNext(sampleEvent); } } } 

那是你的整个事件聚合器。 将其实例传递到每个视图模型中,并将其存储为引用。 然后创建一个类来存储您的事件详细信息,让我们说“ValueChangedEvent”:

 public class ValueChangedEvent { public int Value { get { return _value; } } private readonly int _value; public ValueChangedEvent(int value) { _value = value; } } 

从第一个视图模型发布如下:

 set { _nbre = value; PropertyChanged(this, new PropertyChangedEventArgs("Nbre")); _eventPublisher.Publish(new ValueChangedEvent(value)); } 

使用GetEvent在另一个类中订阅:

 public class ClassBViewModel: INotifyPropertyChanged, IDisposable { private readonly IDisposable _subscriber; public ClassBViewModel(IEventPublisher eventPublisher) { _subscriber = eventPublisher.Subscribe(next => { IsBiggerthanFive = next.Value > 5; }); } public void Dispose() { _subscriber.Dispose(); } } 

信使服务是一种解决方案。 MVVM Light Toolkit有一个实现。 你可以用它来做什么,就是在你的viewmodel中监听特定类型的消息并通过messenger处理它。 http://www.mvvmlight.net/