Окно ошибки показывает модал в MVVM WPF - PullRequest
7 голосов
/ 24 августа 2009

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

При возникновении ошибки я устанавливаюатрибут видимости в viewmodel для Visible, чтобы отобразить окно ошибки.Это все связано в окне Error от модели представления.

Однако, это окно НЕ является модальным!Мне нужно показать это как диалог, а не просто установить видимость в true - могу ли я выполнить какое-либо связывание, даже если мне нужно расширить функциональность окна?Я бы предпочел не разбивать MVVM, если смогу избежать этого.

Спасибо!

Ответы [ 6 ]

3 голосов
/ 25 августа 2009

Разделение View / ViewModel предназначено для отделения взгляда от функциональности. Я твердо верю, что окно - это функциональность, и я выгляжу как единое целое. Например, что если в вашем ErrorMessageViewModel у вас был этот код, который выполняется при возникновении ошибок:

class WindowViewModel : Window
{
}

.
.
.

WindowViewModel newDialog = new WindowViewModel();
newDialog.Content = myErrorListViewModel;
newDialog.Parent = mainWindowViewModel;
newDialog.ShowDialog();

Таким образом, содержимое диалога является ViewModel для вашего списка ошибок. Определите свой View как шаблон данных, который автоматически применяется к списку ошибок ViewModel.

Разве это не похоже на MVVM?

Дело в том, что класс Window - это ViewModel для окна, которое вы видите на экране. Изменяя свойства объекта Window, он влияет на «представление» так же, как если бы свойства WindowView были связаны с WindowViewModel. Единственное, чего не хватает, - это возможности «рестайлинга» окна с помощью WPF, и не важно, как сильно вы пытаетесь его реализовать, вы не сможете этого сделать. Пользователь может изменить стиль окна, изменив тему рабочего стола, но вы не контролируете его. Лучшее, что вы можете сделать, это отключить хром и / или сделать его полноэкранным.

2 голосов
/ 29 августа 2009

Вы найдете пример того, как отображаются окна (неважно, модальные они или нет) в примере ViewModel этого проекта:

WPF Application Framework (WAF)

http://waf.codeplex.com

1 голос
/ 12 июня 2010

Я сделал поведение, чтобы связать некоторые модальные диалоги с командой.

http://www.clr -namespace.com / запись / MVVMModal-диалог-перед тем, обкатка Command.aspx

<Confirm:Confirm IsConfirm="{Binding ElementName=checkBoxConfirm, Path=IsChecked}"
Command="{Binding Path=ButtonCommand}" 
CommandParameter="{Binding ElementName=textBoxParameter, Path=Text}" 
ConfirmMessage="Are you sure you want to fire the command?" 
ConfirmCaption="Question" >
</Confirm:Confirm>
1 голос
/ 18 февраля 2010

Я также работаю над проектом MVVM, где мне нужны модальные диалоговые окна или ящики сообщений. Я нашел следующий способ ее решения:

Программное обеспечение использует только одно окно. Корневым элементом макета является Grid без определений строк или столбцов. Сетка имеет трех детей:

  1. Док-панель, содержащая все обычные элементы, такие как меню, представления с вкладками, строка состояния и т. Д.
  2. Сетка с серым фоном и непрозрачностью 50%. Это используется в качестве завесы, чтобы закрыть панель док-станции, когда действует модальная коробка. Сетка завесы обычно рушится.
  3. Сетка, удерживающая модальные виды, обычно она сворачивается.

В viewmodel для главного окна есть элемент с именем Modal. Если это значение равно null, две сетки для модального использования сворачиваются посредством привязки данных и конвертера для Visibility.Collapsed.

Когда программа хочет отобразить, например, модальное окно сообщения, создается экземпляр MessageBoxViewModel, который присваивается MainViewModel.Modal. MessageBoxViewModel имеет команду для кнопки ОК. Эта команда вызывает событие, которое снова устанавливает значение MainViewModel.Modal в значение null.

Сетка завесы закрывает основную панель DockPanel, поэтому никакие элементы управления вне модального элемента управления не принимают входные данные.

Ваша программа может запускать помпу до тех пор, пока не будет нажата кнопка OK, или команда OK может вызвать следующую. Существует много способов решения различных задач, но решение Model-ModelView должно их поддерживать.

Я чувствую, что эта модель вида в модальном режиме настолько хороша, насколько можно надеяться.

0 голосов
/ 11 июня 2012

Я использую тот же метод, что и Скотт Уитлок.

есть еще одно важное свойство для установки:

class ModalDialog: Window
{
}

.
.
.

var dlg = new ModalDialog {
    Content = viewModelName,
    **TopMost = true,**
    Parent = mainWindowViewModel
};

dlg.ShowDialog();
0 голосов
/ 22 января 2010

В моем недавнем сообщении в блоге вы можете найти простое решение для модальных диалогов и окон сообщений в MVVM для Silverlight, но это можно просто повторно использовать в WPF:

Модальные диалоги с MVVM и Silverlight 4

...