我将对话框代码放入了View的CodeBehind中。我仍然通过ViewModel路由命令,但是ViewModel调用View的实现并获取结果。
假设我有一个MainWindow View(xaml)和一个MainWindow ViewModel,并且我想保存一个文件。
在CodeBehind View(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;
}
public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }
在MainWindow.xaml中,我有一个按钮绑定到委托命令:
<Button Content="Save File" Command="{Binding SaveFile}"/>
像MVP一样,这种实现方式很啰嗦,但对于测试和关注点分离来说非常有效。对我来说,将窗口打开的机制留给View类是有道理的,即使它感觉有点像主动视图。