可以通过显示 ViewModel 中的消息框来满足确认要求。但是,我不认为这是正确的方法。这不会破坏MVVM吗?
在使用“MessageBox”等与视图相关的依赖项时保留 MVVM 样式的一种方法是将它们封装并注入到视图模型中。因此,您可以通过请求一个来表达依赖性IDialogService
在构造函数中:
public class MainViewModel : ViewModelBase
{
private readonly IDialogService _dialog;
public MainViewModel(IDialogService dialog)
{
_dialog = dialog;
}
}
然后你从视图中传递实现:
private readonly MainViewModel _viewModel = new MainViewModel(new DialogService());
该界面封装了您需要的任何功能,例如“警报”、“确认”等。
public interface IDialogService
{
bool Confirm(string message, string caption = "Confirm");
}
并使用它来实现它MessageBox
,或任何其他方法(并切换单元测试的虚拟实现):
public class DialogService : IDialogService
{
public bool Confirm(string message, string caption)
{
return MessageBox.Show(message, caption, MessageBoxButton.OKCancel) == MessageBoxResult.OK;
}
}
这样您就可以将所有确认逻辑从视图移动到视图模型,其中“保存”方法将如下所示:
private void Save()
{
if (!_dialog.Confirm("Do you want to overwrite?", "Overwrite?"))
return;
this.SaveCommand.Execute(null);
}
如果 CanExecute 依赖于 UI(代码隐藏)和 ViewModel 的状态怎么办?
如果您担心测试,那么没有什么CanExecute
取决于应该在代码隐藏中——您应该将类似的内容移动到视图模型中。