2011-03-05 23 views
4

我很新WPF & MVVM範例,我正在努力吸收它。我遇到的問題看起來像很多MVVM beginer面臨相同的&似乎沒有簡單的方法。所以,爲了保持問題域簡單,這裏只是一個實驗性的工作。如何使用中介模式在MVVM中打開/顯示新窗口?

我有一個帶有「新建」按鈕的MainWindow。當我點擊這個按鈕時,我想顯示一個NewWindow.xaml的實例。我怎麼能從MainWindowViewModel做到這一點?中介模式可以幫助嗎?請提出任何良好的實施參考。

我也有一個「關閉」按鈕在主窗口&我想退出應用程序,當我點擊這一個。我需要再次求助:(

回答

2

前段時間我也有同樣的問題。

至少我使用了一個非常簡單的方法,我很滿意。 here是我的解決方案。

在你的視圖模型,你只需要編寫一行代碼:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", newdialogwindowVMgoeshere); 
//do what you want with the dialogresult 
1

我把對話的代碼到視圖的代碼隱藏。我仍然可以通過視圖模型路線的命令,但視圖模型調用視圖的執行情況和取得的結果。

假設我有主窗口查看(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類是有道理的,甚至認爲它有點像主動視圖。

+1

如何視圖模型具有對視圖的引用,以便在查看實例調用公共成員(OpenSaveFileDialog)? – 2011-03-08 13:17:54

+0

我認爲viewmodel會像構造函數參數那樣獲得像IView接口那樣的東西。視圖當然實現了IView並作爲IView傳遞給視圖模型 – blindmeis 2011-03-08 13:51:28

+0

我也在尋找一個好的模式來顯示ViewModel的另一個窗口。但我認爲你的解決方案不好。 ViewModel不應該瞭解任何有關View的內容。 ViewModel公開一個事件會更好,View會處理它以顯示新窗口。 – Fanliver 2017-03-31 13:54:21