2011-07-07 76 views
1

我有一個父窗口,它在ContentControl內部加載了一個usercontrol。父窗口有一個帶有一些按鈕的工具欄(即保存按鈕)。我想分配那些將在usercontrol內處理的按鈕命令。使用MVVM將父窗口的事件綁定到UserControl內部處理程序

我需要從usercontrol的ViewModel管理我自己的ICommand命令,總結一下:用戶點擊「保存」按鈕(在主窗口),這樣按鈕觸發一個事件,userControl處理這個事件以保存信息在控制範圍內。

這可能嗎?

回答

0

過了一段時間,我回到這個問題。我需要與我的父窗口溝通,所以我決定從父窗口執行view-viewmodel datacontext綁定權限,主要是因爲我想讓子viewmodel附加到從其父項觸發的事件,還可以將事件觸發到父項爲了顯示子控件之外的消息。

我知道我可能沒有完全使用MVVM模式,但我想對這些功能有更多的控制權。

2

有兩種方法可以做到這一點。

  1. 使用MVVM,
    因爲你的窗口中包含用戶控件,您需要設置使窗口具有參考用戶控件視圖模型(假設它被稱爲UserControlViewModel)。如果您在UserControlViewModel有一個命令,你可以綁定到該命令,通過調用:UserControlViewModel.Command類似:

    <Button x:Name="Save" Content="Save" Command="{Binding UserControlViewModel.SaveCommand}"> 
    
  2. 使用事件處理程序

    同樣,你的窗口需要有一個參考到實現事件處理程序的類。你可以在你的窗口XAML文件中的以下內容:

    <Button x:Name="Save" Content="Save" Clicked="SaveButtonClicked"/> 
    

    然後在後面的代碼,

      private void SaveButtonClicked(.... sender, .... e) 
          { 
           UserControlClass.SaveData(); 
           // or using command 
           UserControlClass.MyCommand.Execute() 
          } 
    
+0

嗨@seekle,如果我沒有明確聲明一個usercontrol,而是用一個帶有viewModel的ContentControl加載它們會怎樣。我怎樣才能讓泛型父「知道」「某個」viewModel正在監聽其事件?謝謝 –

1

OK,你想一個子元素的命令綁定到父窗口。首先爲usercontrol命名(例如x:Name = MyUserControl),並在usercontrol的datacontext/viewmodel(例如ICommand MyCommand)中寫入一個公共命令。現在,在按鈕做到這一點

<Button x:Name="SaveButton" Command={Binding ElementName=MyUserControl, Path=DataContext.MyCommand} /> 

這將綁定按鈕命令保存到命令孩子:)用戶控件的DataContext的內部

順便說一句,如果你正在尋找周圍的其他方式(即結合孩子命令到mvvm中的父項),您將需要使用FindAncestor。你可以看看我的codeproject article 關於這個:)

+0

感謝@Amit爲您的代碼和鏈接。我想要做的是有一個按鈕的包裝,我會加載任何我想要的用戶控件,但每個用戶控件應該響應點擊我的包裝上的事件。我能以更通用的方式做到嗎?或者,我錯了嗎? –

+0

@Rodrigo Caballero:我能想到的最好的方法是[CompositeCommand](http://msdn.microsoft.com/en-us/library/microsoft.practices.prism.commands.compositecommand%28v=pandp.38 %29.aspx)。你可以下載[Prism doc](http://compositewpf.codeplex.com/releases/view/55580)並查看第6章。這會給你一個想法,然後你可以下載Prism的代碼並以你自己的方式實現:) – Amit

0

這聽起來像路由命令可以工作的情況。對於路由命令,將收費鍵的命令設置爲「保存」。然後在用戶控件中添加一個偵聽「保存」命令的命令綁定。

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.CommandBindings> 
    <CommandBinding 
     Command="Save" 
     CanExecute="SaveCommand_CanExecute" 
     Executed="SaveCommand_Executed" 
    /> 
    </UserControl.CommandBindings> 

</UserControl> 

在該命令綁定後臺代碼的事件處理程序,只是找到視圖模型和它的視圖模型調用save命令。如果你想要更純粹的MVVM方法,你可以試試Josh Smith's approach to routed commands with MVVM

使用這種方法,只要用戶控件具有焦點在其內部,那麼保存按鈕的保存命令將路由到用戶控件的命令綁定並執行保存命令。

我認爲這可能會實現您將工具欄按鈕與ContentPresenter中動態加載的用戶控件分離的目標。

+0

的確,這種方法可以解決它。但是,您正在討論使用ApplicationCommands。如果我想使用自己的ICommands(在特定的ViewModel上),我認爲這是不可能的,也許把命令作爲一個靜態屬性,但我認爲可能有另一種方法。 –

+0

此方法確實使用ApplicationCommands,您可以在UserControl中截取這些應用程序。一旦截獲,你可以在代碼中調用你自己的ICommand。或者,您可以使用Josh Smith的方法將攔截的應用程序命令直接傳遞給虛擬機。 – NathanAW

相關問題