MVVM - просмотр модельных представлений модельных коммуникаций - PullRequest
13 голосов
/ 19 марта 2010

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

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

A MainPage View ---> A MainPage ViewModel

Если что-то изменится в представлении настроек, оно вернется в модель представлений настроек. Итак, я хочу, чтобы модель представления настроек сообщала модели представления главной страницы о том, что изменилось. Затем MainPage ViewModel сообщит View.

Ответы [ 4 ]

18 голосов
/ 19 марта 2010

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

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

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

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

3 голосов
/ 19 марта 2010

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

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

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

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

1 голос
/ 19 марта 2010

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

public interface IMessenger
    {
      void NotifyAction();
    }</p>

<pre><code>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();    
     }

  }
}

0 голосов
/ 27 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...