Откройте диалоговое окно в WPF MVVM

Алоха

Вы могли бы хотеть попробовать SqlDbDiff. Это может генерировать сценарии изменения. Свободный выпуск делает достаточно хорошее задание.

13
задан BoltClock 19 June 2015 в 08:21
поделиться

4 ответа

Я использовал EventAggregator из Prism v2 в аналогичных сценариях. В примахах хорошо то, что вы не В вашем приложении MVVM нужно использовать всю структуру. Вы можете извлечь функции EventAggregator и использовать их вместе с текущими настройками.

0
ответ дан 2 December 2019 в 00:03
поделиться

Я сталкивался с подобными проблемами. Вот как я их решил и почему я сделал то, что сделал.

Мое решение:

Моя MainWindowViewModel имеет свойство типа ModalViewModelBase, называемое Modal. Если моему коду требуется, чтобы определенное представление было модальным, он помещает ссылку на него в этом свойстве. MainWindowView наблюдает за этим свойством через механизм INotifyPropertyChanged. Если Modal установлен на некоторую виртуальную машину, класс MainWindowView возьмет виртуальную машину и поместит ее в окно ModalView, где соответствующий UserControl будет отображаться с помощью магии DataTemplates, окно отображается с помощью ShowDialog. ModalViewModelBase имеет свойство DialogResult и свойство IsFinished. Когда для IsFinished установлено значение true модальной виртуальной машиной, представление закрывается.

У меня также есть некоторые специальные приемы для выполнения подобных интерактивных вещей из потоков backgroundworker, которые хотят запросить ввод данных у пользователя.

Мое рассуждение:

] Принцип модальных представлений заключается в том, что другие представления отключены, а модальное окно показано. Это часть логики представления, которая, по сути, не имеет внешнего вида. Вот почему у меня есть свойство для него в MainWindowViewModel. Если бы я пошел дальше, я должен был бы сделать все остальные свойства или команды для всех других виртуальных машин в основной виртуальной машине исключениями, в то время как в модальном режиме, но я считаю это чрезмерным.

Механизм View фактически отрицает Пользователь любые другие действия, необязательно выполнять с всплывающим окном и showdialog, возможно, вы поместите модальное представление в существующее окно, но отключите все остальные или что-то еще. Эта связанная с представлением логика принадлежит самому представлению. (То, что типичный дизайнер не может кодировать эту логику, кажется второстепенным. Нам всем иногда нужна помощь.)

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

0
ответ дан 2 December 2019 в 00:03
поделиться

I don't like most of the current suggestions for one reason or another, so I thought I would link to a nearly identical question with answers I do like:

Open File Dialog MVVM

Specifically the answer by Cameron MacFarland is exactly what I do. A service provided via an interface to provide IO and/or user interaction is the way to go here, for the following reasons:

  • It is testable
  • It abstracts away the implementation of any dialogs so that your strategy for handling these types of things can be changed without affecting constituent code
  • Does not rely on any communication patterns. A lot of suggestions you see out there rely on a mediator, like the Event Aggregator. These solutions rely on implementing two-way communication with partners on the other side of the mediator, which is both hard to implement and a very loose contract.
  • ViewModels remain autonomous. I, like you, don't feel right given communication between the controller and the ViewModel. The ViewModel should remain autonomous if for no other reason that this eases testability.

Hope this helps.

14
ответ дан 2 December 2019 в 00:03
поделиться

Вы можете прочитать эту статью о MVVM. Он описывает, как контроллер может взаимодействовать с ViewModel:

http://waf.codeplex.com/wikipage?title=Model-View-ViewModel%20Pattern&ProjectName=waf

0
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: