2014-01-24 1 views
3

Приветствуем всех и благодарим заранее за ваше время.Каков наилучший способ открыть новое окно с использованием MVVM в WPF

В настоящее время я изучаю MVVM с помощью WPF для небольшого приложения Biz, которое я пишу. Я прочитал много статей о шаблоне MVVM и обнаружил, что одна из ключевых областей - как можно больше отделить ViewModel от представления.

Я хочу открыть новое окно в своем приложении, но я не уверен, что я должен открыть его из ViewModel с помощью ICommand или непосредственно из представления с использованием стандартного события. Кто-то, с кем я работаю, предположил, что я должен использовать команды, но потом я подумал, что это будет означать ссылку на представление в моей модели ViewModel, которая, согласно тому, что я понимаю, именно то, что шаблон MVVM фокусируется на предотвращении.

Я понимаю, что если окно откроется только для целей навигации, и процесс открытия этих новых окон не повлияет на Модель, я должен сохранить все это в представлении, используя стандартные события.

Я знаю, что в развитии все «зависит», но угадайте, мой вопрос есть «правильный»/стандартный способ сделать это?

С наилучшими пожеланиями, Daniel

+0

Некоторые дальнейшего чтения по классам MVVM Light посыльного: http://msdn.microsoft.com/en-us/magazine/jj694937.aspx – Daniel

ответ

4

Да, виртуальные машины должны взаимодействовать с представлениями с использованием событий, которые Представления могут подписаться ...

В VM:

public event EventHandler<NotificationEventArgs<string>> DisplayOptionsNotice; 

В Вид:

private readonly MainViewModel mvm; 
... 
mvm = DataContext as MainViewModel; 
mvm.DisplayOptionsNotice += DisplayOptionsWindow; 
... 
private void DisplayOptionsWindow(object sender, NotificationEventArgs<string> e) 
{ 
    ... 
    optionsWindow = new OptionsWindow { Owner = this }; 
    optionsWindow.ShowDialog(); 
    ... 
} 
+0

Это делает соединение между вашим видом и VM ... –

+0

Извините ... как? VM только публикует событие, которое не знает, какое окно должно открываться. – Daniel

+0

@ReedCopsey Как так? VM только публикует событие, которое любой заинтересованный объект может подсечь ... Если вы имеете в виду ссылку на VM в представлении, VM уже является DataContext представления, поэтому он связан с ним в любом случае ... –

1

, но потом я подумал, что это будет означать ссылку на View в моей ViewModel, который в соответствии с тем, что я понимаю, это именно то, что шаблон MVVM фокусируется на предотвращении.

В общем, способ, которым это обрабатывается, заключается в некоторой форме инверсии управления. Большинство фреймворков MVVM предоставят услугу какой-либо формы для открытия окна и используют локализатор сервисов или инжекцию зависимостей для предоставления услуги ViewModel.

Это позволяет вашему ViewModel оставаться развязанным из определенной структуры рендеринга представления - вы должны передать службу новой виртуальной машинке и сказать «Показать эту виртуальную машину в окне», и этот код будет специфичным для платформы.

+0

Спасибо, я считаю ваш комментарий очень интересным, есть ли какие-либо дальнейшие чтения, которые вы бы порекомендовали по этой теме? – Daniel

+0

@ Daniel Взгляните на классы MVVM Light Messenger для примеров одного подхода, который используется здесь. –

+0

Забыл упомянуть, что я не использую определенную MVVM Framework. Лучше всего было научиться мыслить с нуля. – Daniel

0

Как сказал Рид Услуги локатор или DI выполнит работу и не нарушит шаблон MVVM. из моего опыта вам нужно будет сделать три вещи: Сначала проверьте, что Locator Service или Di видят, что более удобно для вас и реализовать.
Второй запуск, создающий интерфейс IWindow \ IWindowDialog, будет реализован, например, ваш вид (окна \ Messagebox - если хотите).

последнее, что нужно для реализации окон \ сообщений.

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

Успехов

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