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 или непосредственно на Блог Марлона Греча