2015-09-07 58 views
1

我有一個WPF應用程序,我試圖在MVVM模式(儘可能)中實現。我的一個視圖模型的打開一個子窗口使用如下代碼:WPF:在Modal Windows中使用RoutedCommand MVVM方式

SomeChildWindow childWin = new SomeChildWindow(); 
childWin.DataContext = someChildViewModel; 
childWin.ShowDialog(); 

我遇到的問題是,我使用SomeChildWindow一個的RoutedCommand是沒有得到好評:

<Button Content="Do Work" Command="root:GlobalCommand.DoWork"/>

GlobalCommand是一個靜態類,DoWork是一個RoutedUICommand。我已經DoWork綁定到代碼中的我的主視圖模型是這樣的:

//Method inside the main view model 
public void BindGlobalCommands(Window win) 
{ 
    win.CommandBindings.Add(new CommandBinding 
     (GlobalCommand.DoWork, (s, e) => { this.DoSomeWork(); })); 
} 

我做了一些研究,我敢肯定,我有同樣的問題,因爲誰問這個問題的人:WPF Routed Commands and ShowDialog Windows。然而,爲這個問題提供的答案要求父視圖模型直接瞭解它自己的視圖,而我的視圖並不是這樣,我正在用正確的MVVM方式產生窗口嗎?

如何在我的子窗口中使用RoutedCommand

+0

命令是視圖模型的一部分嗎?如果是這樣,Command不應該使用'{Binding ...}'而不是引用全局命令?請添加更多詳細信息。 –

+0

@ErnodeWeerd,我增加了一些細節。我的意圖是在主視圖模型中存儲一些全局命令的邏輯。這樣任何子控件都可以使用RoutedUICommands來調用全局命令。另外,如果從不同位置調用相同的命令,我想避免重複的代碼。 – DaveS

回答

0

對於對話框,我創建了獨立的ViewModel,它們可以成爲主ViewModel的一部分。

主要視圖模型實例化對話框的VM,創建對話框,設置的DataContext並等待該對話框關閉(如果它是莫代爾)

對話框使用該對話框的視圖模型的命令。

一旦對話框關閉,主ViewModel將查看對話框的虛擬機屬性對話框(Yes,No,Cancel,Ok,...)的結果。根據這個結果,主VM然後使用對話的內容來執行一些命令。

通過這種方式,對話框可以重複使用,並且主VM保持控制。

+0

我正在做的很多你在這裏描述的。除了我使用的對話框比簡​​單的'MessageBox'更復雜並且具有自己的帶有一堆按鈕的'ListView'。另外我試圖綁定的命令是一個'RoutedUICommand'。就像我在其他評論中提到的那樣,我沒有在這裏使用基本的'ICommand',因爲這個功能對於整個應用程序是全局的,並且可以從其他UserControls/Windows中調用。 – DaveS

+0

@DaveS - 這是我的建議:在對話框的虛擬機中放入所有複雜的東西,並在關閉對話框後使用主虛擬機。如果存在重疊的功能,那麼可能應該將這兩個視圖模型分解出來並加以引用(例如,在存儲庫中) –