我将对话框代码放入 View 的 CodeBehind 中。我仍然通过 ViewModel 路由命令,但是 ViewModel 调用 View 的实现并获得结果。
假设我有 MainWindow View (xaml) 和 MainWindow ViewModel,我想保存一个文件。
在代码隐藏视图 (MainWindow.xaml.cs) 中,我添加代码以创建对话框并返回保存文件名:
public FileInfo OpenSaveFileDialog(string title, string filter)
{
var dialog = new SaveFileDialog
{
Filter = filter,
Title = title
};
var result = dialog.ShowDialog();
if (!result.Value) return null;
return new FileInfo(dialog.FileName);
}
在 ViewModel 我有一个 DoSaveFile() 方法:
public void DoSaveFile()
{
var file = OpenSaveFileDialog("Save File", "Super files (*.super)|*.super |All files (*.*)|*.*");
if (file == null) return;
//Save logic...
}
public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }
在 MainWindow.xaml 中,我有一个绑定到委托命令的按钮:
<Button Content="Save File" Command="{Binding SaveFile}"/>
与 MVP 一样,这个实现很健谈,但它非常适合测试和关注点分离。对我来说,将窗口打开机制留给 View 类是有意义的,即使它感觉有点像活动视图。