MVVM-View Model-View Model Communications

Как мне заставить две модели просмотра взаимодействовать друг с другом с помощью MVVM Light. Я знаю, как использовать класс Messenger и зарегистрироваться и т.д. Вот мой сценарий

A Settings View ---> a Settings View Model 
                                  .
                                  .
                                  .

A MainPage View ---> A MainPage ViewModel

Если что-то изменится в окне "Настройки", оно вернется к "Модели настройки". Итак, я хочу, чтобы модель View Settings отображалась в модели MainPage View Model о том, что изменилось. Затем MainPage ViewModel сообщит View.

Ответы

Ответ 1

Общим шаблоном для этого стиля проблемы является Mediator (класс, который рассматривает как ссылку на модели и может использоваться для передачи сообщений между два).

С тех пор класс посредника был перемещен в Cinch WPF/SL MVVM Framework, который по-прежнему активно развивается/поддерживается.

Я предпочитаю шаблон Event Aggregator, пример можно найти в структуре Prism. В этом шаблоне разные модели представлений подписываются на события из агрегатора, а другие публикуют события.

Надеюсь, что это поможет

Ответ 2

I второе предложение Найджела об использовании посредника, посмотрите блог Джоша Смита и его реализацию:

http://joshsmithonwpf.wordpress.com/?s=mediator

Внизу вы можете скачать прототип и демонстратор посредника, просто не забудьте переименовать его из .doc в .zip.

Надеюсь, что это поможет...

Ответ 3

Одна вещь, которую вы можете попробовать, - попытаться реализовать инверсию зависимостей. Определите интерфейс с некоторыми действиями/контрактами. Внедрите этот интерфейс в MainviewModel. Передайте этот интерфейс в качестве переменной-члена в SettingsViewModel. Поэтому всякий раз, когда модель просмотра параметров должна уведомлять что-то о главном, он будет использовать этот интерфейс. Кроме того, другие модели просмотра могут использовать одну и ту же стратегию.  

public interface IMessenger
    {
      void NotifyAction();
    }

public class MainViewModel:InotifyProprtyChanged,IMessenger
{
 public void NotifyAction()
{
}
}

public class SettingsViewModel:INotifyPropertyChanged
{
  public IMessenger Messenger{get;set;}

  public void SomeCommandExecutor()
  {
    if(Messenger!=null)
     {
       Messenger.NotifyAction();    
     }

  }
}

код>

Ответ 4

Может быть, вы можете использовать sur Рисунок посредника V2 Сделано Джошем Смитом и Марлоном Гречем.

Ознакомьтесь с классом Messenger V2 в библиотеке MVVM Foundation или непосредственно на Блог Марлона Греча