Существует несколько способов решения проблемы.
Самое простое - просто использовать MessageBox.Show
в вашей модели представления. Это просто для кода и легко понять. Это также лишает вас возможности модульного тестирования модели представления, поскольку теперь его поведение заключается в блокировании и ожидании ввода пользователя.
Следующим шагом вверх по цепочке сложности является определение интерфейса для моделей представлений, которые необходимо использовать, когда им нужно задать вопрос «да» или «нет». Например:
public interface IConfirmationDialogService
{
bool Show(string question);
}
Ваша модель представления затем реализует свойство:
public IConfirmationDialogService ConfirmationDialogService { get; set; }
и вы реализуете класс обслуживания для использования моделью представления, когда она находится в вашем приложении:
public class ViewConfirmationDialogService : IConfirmationDialogService
{
public string Caption { get; set; }
public bool Show(string question)
{
return MessageBox.Show(
string question,
Caption,
MessageBoxButtons.YesNo,
MessageBoxImage.Question) == MessageBoxResult.Yes;
}
}
Теперь в любом месте модели просмотра вы можете получить подтверждение от пользователя:
if (!ConfirmationDialogService.Show("Do you want to do this?"))
{
return;
}
Как вы тестируете это? С издевательством. В ваших модульных тестах вы реализуете класс для имитации пользовательского ввода:
public class MockConfirmationDialogService : IConfirmationDialogService
{
public MockConfirmationDialogService(bool result)
{
_Result = result;
}
private bool _Result;
public bool Show(string question)
{
return _Result;
}
}
, чтобы вы могли протестировать свои методы, ожидающие ввода пользователя, например ::
MyViewModel vm = new MyViewModel()
ConfirmationDialogService = new MockConfirmationDialogService(false);
vm.ExecuteCommand();
Assert.IsFalse(vm.CommandChangedSomething);
vm.ConfirmationDialogService = new MockConfirmationDialogService(true);
vm.ExecuteCommand();
Assert.IsTrue(vm.CommandChangedSomething);
Следующий шаг по сложности - это когда вы понимаете, что это всего лишь одна из многих проблем, с которыми вы столкнетесь при реализации диалогов в моделях представления, и что вместо IConfirmationDialogService
для вопросов «да» или «нет» вам понадобится более надежный сервис диалогов, который может обрабатывать диалоги всех видов. К тому времени вы уже будете на пути к реализации собственной структуры модели представления, и вам следует начать смотреть на существующие структуры модели представления, чтобы увидеть, как они это делают.