2009-11-03 2 views
1

Может кто-нибудь объяснить, как работает шаблон посредника с несколькими экземплярами.MVVM Mediator несколько экземпляров

Мой код в представлении:

public MyView() { 
    Mediator.Register("CloseWindow",()=>Close()); 
} 

и в ViewModel:

public SomeMethod() { 
    Mediator.Notify("CloseWindow"); 
} 

Это работает поиск до тех пор, пока существует только один экземпляр View - ViewModel пара.

Как решить его с помощью нескольких экземпляров?

ответ

1

Я использую альтернативное решение. MyView реализует интерфейс IMyView, который содержит метод Close. Объект MyViewModel связывает представление и поэтому может вызвать метод Close через интерфейс.

Если вы заинтересованы в конкретном примере, то вы можете посмотреть на:

WPF Application Framework (WAF)

+0

Я выбираю шаблон медиатора, потому что он казался более простым, чем интерфейсы, и что я могу использовать его как для вертикального (MV <-> V), так и для горизонтального (MV <-> MV). Теперь я вижу, что это было неправильно, и вместо этого будем использовать интерфейсы. По моему мнению, шаблон медиатора принципиально нарушен (по крайней мере, для взглядов). Медиатор использует GC для управления жизненным циклом, пока нет. Поэтому ответ заключается в том, чтобы не использовать медиатор для просмотра. – adrianm

0

Я не знаю, как работает ваша конкретная реализация шаблона посредника, но в моем распоряжении вы можете отправить больше информации, чем просто строки.

Например:

public MyView() { 
    Mediator.Register<CloseWindowMessage>(message => 
    { 
     if (message.ViewModel == DataContext) Close(); 
    }); 
}  

и в ViewModel:

public SomeMethod() { 
    Mediator.Notify(new CloseWindowMessage(this)); 
} 

В этом примере ViewModel проходит себя в качестве параметра вида. Затем представление может проверить, что сообщение отправляется из его модели представления.

+0

Я думал об этом, но я думаю, что это становится много стратегии выбора в. Я склоняюсь к решению, в котором я отменил регистрацию сообщений в событии Close. – adrianm

+0

Или вы можете создать отдельный класс сообщений для каждого диалога, чтобы избежать «отказа». – Grokys

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