Как я иду о наличии двух моделей представления, общаются друг с другом использование Свет MVVM. Я знаю, как использовать класс средства рассылки и регистр и т.д. Вот мой Сценарий
A Settings View ---> a Settings View Model
.
.
.
A MainPage View ---> A MainPage ViewModel
Если что-то изменится в Представлении Настроек, то оно будет обмениваться сообщениями назад к Модели Представления Настроек. Таким образом я хочу, чтобы Модель Представления Настроек связалась с Моделью Представления MainPage о том, что изменилось. MainPage ViewModel затем скажет Представление.
Распространенным шаблоном для этого типа проблем является Посредник (класс, на который ссылаются обе модели представления и который может использоваться для передачи сообщений между ними).
С тех пор класс Mediator был перемещен в Cinch WPF / SL MVVM Framework , который, похоже, все еще активно разрабатывается / поддерживается.
Я предпочитаю шаблон Агрегатор событий , пример которого можно найти в структуре Prism. В этом шаблоне разные модели представления подписываются на события от агрегатора, а другие публикуют события.
Надеюсь, это поможет
Я поддерживаю предложение Найджела использовать Посредник, взгляните на блог Джоша Смита и его реализацию:
http://joshsmithonwpf.wordpress.com/?s=mediator
Внизу вы можете скачать Прототип и Демо Посредника, просто запомните чтобы переименовать его из .doc в .zip.
Надеюсь, это поможет ...
Вы можете попробовать реализовать инверсию зависимостей. Определите интерфейс с некоторыми действиями / контрактами. Реализуйте этот интерфейс в MainviewModel. Передайте этот интерфейс как переменную-член в SettingsViewModel. Поэтому всякий раз, когда модель представления настроек должна сообщать что-то в main, она будет использовать этот интерфейс. {{ 1}} И, кроме того, другие модели представлений могут использовать ту же стратегию.
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();
}
}
}