2016-05-06 2 views
0

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

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

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

Проблема заключается в том: Если я называю MessageBox внутри ViewModel, то ViewModel становится непроверяема с внешней стороны.

//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 или чем-то еще, который блокирует процесс, прежде чем продолжить.

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

+1

Согласно моему пониманию не следует писать любой просмотреть связанный код в поле зрения модели и кода, связанного с логикой. Таким образом, вы можете открыть окно сообщения в виде кода позади и на основе выбора пользователя, который вы назвали своим методом удаления в классе модели представления. –

+0

'public interface MuhMessageBox {bool AreYouCrazy (строковое сообщение); } ' – Will

ответ

1

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

Вот некоторые ссылки на некоторый код в репо Prism на GitHub:

Notification Request

Confirmation Request

Custom Content

Custom Request

+0

Спасибо, я прочитаю его и вернусь позже. – Michael

+0

Оба ответа от Себастьяна Шульца и Р. Рихарда были отличными помощниками, но я принимаю этот ответ за других, потому что пример кода, предоставленный Р. Рихардом, помог мне больше всего , Если у вас нет подсказки, с чего начать, посмотрите пример, это потрясающе, и это делает многие вещи ясными, когда дело доходит до WPF, MVVM и интерактивности. Огромное спасибо. – Michael

+0

Ссылка устарела. Есть ли обновленный? – Flynn1179

3

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

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

+0

Спасибо, я прочитаю его и вернусь позже. – Michael

+0

Еще раз спасибо, Себастьян. Ваш намек был большой помощью, но в этом случае я принимаю R.Richards как наилучшую помощь из-за его замечательного примера кода. См. Мой комментарий в соответствии с принятым ответом. – Michael