使用MVVM将Parent窗口的事件绑定到UserControl内部处理程序

时间:2011-07-07 23:30:46

标签: wpf mvvm

我有一个父窗口,可以在ContentControl中加载usercontrol。父窗口有一个带有一些按钮的工具栏(即保存按钮)。我想分配那些将在usercontrol中处理的按钮命令。

我需要从usercontrol的ViewModel管理自己的ICommand命令,总结一下:用户单击“保存”按钮(在主窗口上),这样按钮就会触发userControl处理的事件以保存信息控制。

这可能吗?

4 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。

  1. 使用MVVM,
       由于您的窗口包含UserControl,因此您需要进行设置,以便Window引用UserControl ViewModel(假设它被称为UserControlViewModel)。如果在UserControlViewModel中有一个命令,则可以通过调用:UserControlViewModel.Command来绑定到该命令:

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

    同样,您的窗口需要引用实现事件处理程序的类。您可以在Window XAML文件中包含以下内容:

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

    然后在你的代码中,

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

答案 1 :(得分:1)

好的,您正在尝试将子元素的命令绑定到父窗口。首先给usercontrol命名(例如x:Name = MyUserControl),然后在usercontrol的datacontext / viewmodel中写一个public命令(例如ICommand MyCommand)。现在在按钮中执行此操作

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

这会将save buttons命令绑定到child usercontrol的datacontext中的命令:)

顺便说一句,如果您正在寻找相反的方法(即将子命令绑定到mvvm中的父命令),则需要使用FindAncestor。您可以查看我的codeproject article 对此:)

答案 2 :(得分:0)

这听起来像路由命令可以工作的情况。对于routed命令,将Tollbar按钮的Command设置为“Save”。然后在用户控件中添加一个侦听“save”命令的命令绑定。

<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>

在代码隐藏的命令绑定事件处理程序中,只需找到viewmodel并在其viewmodel上调用save命令。如果您想要更纯粹的MVVM方法,可以尝试Josh Smith's approach to routed commands with MVVM

使用这种方法,只要用户控件在其中的某处有焦点,则保存按钮的保存命令将路由到用户控件的命令绑定并执行save命令。

我认为这可能会实现将工具栏按钮与ContentPresenter中动态加载的用户控件分离的目标。

答案 3 :(得分:0)

过了一会儿,我回到这个问题。我需要与父窗口进行通信,所以我决定从父窗口执行view-viewmodel datacontext绑定,主要是因为我希望子视图模型附加到从其父窗口发出的事件,并且我也可以向父窗口发送事件为了在子控件之外显示消息。

我知道我可能没有完全使用MVVM模式,但我希望能够更好地控制这些功能。