我有一个父窗口,可以在ContentControl中加载usercontrol。父窗口有一个带有一些按钮的工具栏(即保存按钮)。我想分配那些将在usercontrol中处理的按钮命令。
我需要从usercontrol的ViewModel管理自己的ICommand命令,总结一下:用户单击“保存”按钮(在主窗口上),这样按钮就会触发userControl处理的事件以保存信息控制。
这可能吗?
答案 0 :(得分:2)
有两种方法可以做到这一点。
使用MVVM,
由于您的窗口包含UserControl,因此您需要进行设置,以便Window引用UserControl ViewModel(假设它被称为UserControlViewModel)。如果在UserControlViewModel中有一个命令,则可以通过调用:UserControlViewModel.Command来绑定到该命令:
<Button x:Name="Save" Content="Save" Command="{Binding UserControlViewModel.SaveCommand}">
使用事件处理程序
同样,您的窗口需要引用实现事件处理程序的类。您可以在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模式,但我希望能够更好地控制这些功能。