Этот вопрос относится к приложению WPF на основе PRISM 5.0 и шаблона MVVM.

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

Например: Один из распространенных способов - спросить пользователя с окном сообщений, действительно ли он хочет удалить данные, которые нельзя восстановить после удаления.

Проблема: Если я вызываю MessageBox внутри ViewModel, ViewModel снаружи становится untestable .

//BAD!
public class ViewModel
{
    public Boolean Delete()
    {
        //Blocking and therefore untestable in automatic UnitTests
        MsgBoxResult result = MsgBox.Show("Do you really want to delete?"); 

        if (result == yes) {//Do stuff that deletes data here;}

    }
}

Одна из возможностей - задать вопрос другим частным методом, который вызывает общедоступный метод.

//BETTER, BUT OK?
public class ViewModel
{
    private void OnDeleteAction
    {
        MsgBoxResult result = MsgBox.Show("Do you really want to delete?"); 
        if (result == yes) {Delete();}
    }

    public Boolean Delete()
    {
        //Testable from the outside again, because no blocking question

        //Do stuff that deletes data here
    }

Мой вопрос: это хороший способ или есть более элегантный способ задать вопрос пользователю в ViewModel? Не могли бы вы дать мне подсказку или ссылку, что лучше всего для PRISM 5.0?

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

Спасибо за любые подсказки!

0
Michael 6 Май 2016 в 14:23

2 ответа

Лучший ответ

Prism Interactivity - это то, что вам нужно. Это позволяет вам делать подтверждения, уведомления и создавать настраиваемые диалоговые окна, которые хорошо работают с шаблоном MVVM. Я успешно использую их в своих приложениях Prism.

Вот несколько ссылок на код из репозитория Prism на GitHub:

Запрос на уведомление

Запрос на подтверждение

Пользовательский контент

Пользовательский запрос

1
R. Richards 5 Апр 2017 в 16:04

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

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

3
Sebastian Siemens 6 Май 2016 в 11:28