Этот вопрос относится к приложению 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 или чему-то еще, что блокирует процесс, прежде чем продолжить.
Спасибо за любые подсказки!
2 ответа
Prism Interactivity - это то, что вам нужно. Это позволяет вам делать подтверждения, уведомления и создавать настраиваемые диалоговые окна, которые хорошо работают с шаблоном MVVM. Я успешно использую их в своих приложениях Prism.
Вот несколько ссылок на код из репозитория Prism на GitHub:
Я знаю две альтернативы, которые могут уменьшить связь между View и ViewModel: использование службы взаимодействия и запуск запросов на взаимодействие. Оба очень хорошо объяснены здесь; вы можете захотеть взглянуть.
Общая идея состоит в том, что вы абстрагируетесь от того, как выполняются асинхронные взаимодействия, и работаете с чем-то более похожим на логику, основанную на событиях, в то же время позволяя ViewModel выразить, что она хочет взаимодействовать с пользователем как часть операции; Конечный результат состоит в том, что вы можете задокументировать это взаимодействие и протестировать его.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.