2014-12-12 4 views
3

Я новичок в MVVM шаблон проектирования, и у меня есть эти ViewModels:Связь между двумя ViewModels

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. Каков наилучший способ выполнить эту задачу?
+1

Самый простой подход, вероятно, заключается в создании ViewModel, который содержит экземпляр каждого из них, а затем подключает события для передачи данных между ними. – Andrew

+0

Правильный шаблон проектирования для этого является Посредником. http://en.wikipedia.org/wiki/Mediator_pattern – Gjeltema

+2

Другой подход - использовать Prism и его класс EventAggregator. Затем ViewModel A может поднять событие, а ViewModel B может подписаться на мероприятие, а не знать/заботиться, кто поднял это событие. –

ответ

2

Я согласен с другими комментаторами в том, что посредник/pub-sub/event aggregator/messenger - хороший способ пойти. Если вы не используете рамки 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); 
     } 
    } 
} 

Это весь ваш агрегатор событий. Передайте экземпляр его в каждую модель представления и сохраните ее как ссылку. Затем создайте класс для хранения сведений о событиях, скажем, «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)); 
} 

Subscribe в другом классе с использованием 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

Служба обмена сообщениями является решением. В MVVM Light Toolkit есть реализация этого. Что вы можете с ним сделать, это слушать определенный тип сообщения в вашей модели просмотра и обрабатывать его через мессенджер. http://www.mvvmlight.net/

Смежные вопросы