Этот вопрос относится к приложению 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 или чем-то еще, который блокирует процесс, прежде чем продолжить.
Спасибо за любые подсказки!
Согласно моему пониманию не следует писать любой просмотреть связанный код в поле зрения модели и кода, связанного с логикой. Таким образом, вы можете открыть окно сообщения в виде кода позади и на основе выбора пользователя, который вы назвали своим методом удаления в классе модели представления. –
'public interface MuhMessageBox {bool AreYouCrazy (строковое сообщение); } ' – Will