两个视图模型之间的通信
我是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
的值。 所以:
- 两个视图模型如何在它们之间进行通信而没有另一个视图模型?
- 完成此任务的最佳方法是什么?
我同意其他评论者认为调解员/ 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/