我把對話的代碼到視圖的代碼隱藏。我仍然可以通過視圖模型路線的命令,但視圖模型調用視圖的執行情況和取得的結果。
假設我有主窗口查看(XAML),以及主窗口視圖模型,我想保存文件
在代碼隱藏視圖(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類是有道理的,甚至認爲它有點像主動視圖。
如何視圖模型具有對視圖的引用,以便在查看實例調用公共成員(OpenSaveFileDialog)? – 2011-03-08 13:17:54
我認爲viewmodel會像構造函數參數那樣獲得像IView接口那樣的東西。視圖當然實現了IView並作爲IView傳遞給視圖模型 – blindmeis 2011-03-08 13:51:28
我也在尋找一個好的模式來顯示ViewModel的另一個窗口。但我認爲你的解決方案不好。 ViewModel不應該瞭解任何有關View的內容。 ViewModel公開一個事件會更好,View會處理它以顯示新窗口。 – Fanliver 2017-03-31 13:54:21