两个视图模型之间的通信

时间:2014-12-12 21:05:19

标签: c# .net wpf winforms mvvm

我是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的值将被更改。所以:

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

2 个答案:

答案 0 :(得分:2)

我同意其他评论者认为mediator / pub-sub / event聚合器/信使是一个很好的方法。如果您没有使用内置解决方案的MVVM框架,那么我建议this simple approach that takes advantage of the Reactive extensions

public class EventPublisher : IEventPublisher
{
    private readonly ConcurrentDictionary<Type, object> subjects
        = new ConcurrentDictionary<Type, object>();

    public IObservable<TEvent> GetEvent<TEvent>()
    {
        var subject =
            (ISubject<TEvent>) subjects.GetOrAdd(typeof (TEvent),
                        t => new Subject<TEvent>());
        return subject.AsObservable();
    }

    public void Publish<TEvent>(TEvent sampleEvent)
    {
        object subject;
        if (subjects.TryGetValue(typeof(TEvent), out subject))
        {
            ((ISubject<TEvent>)subject)
                .OnNext(sampleEvent);
        }
    }
}

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

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<ValueChangedEvent>(next => 
        {
            IsBiggerthanFive = next.Value > 5;
        });
    }

    public void Dispose()
    {
        _subscriber.Dispose();
    }
}

答案 1 :(得分:1)

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