Я поместил код диалога в CodeBehind View. Я все еще направляю команду через 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;
//Save logic...
}
public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }
В MainWindow.xaml у меня есть кнопка, привязанная к команде делегата:
<Button Content="Save File" Command="{Binding SaveFile}"/>
Как и в случае с MVP, эта реализация является болтливой, но она отлично работает для тестирования и разделения проблем. Для меня имеет смысл оставить механику открытия окна классу View, даже несмотря на то, что он выглядит как активный просмотр.