窗口中的菜单项,用户控件中的命令绑定

本文关键字:命令 绑定 控件 菜单项 窗口 用户 | 更新日期: 2023-09-27 18:07:07

有一个窗口:

<Window x:Class="SomeNamespace.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="350" Width="525">
<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Copy"
        CanExecute="CommandCanExecute" Executed="CommandExecuted"/>
</Window.CommandBindings>
<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="File">
            <MenuItem Command="ApplicationCommands.Copy"/>
        </MenuItem>
    </Menu>
</DockPanel>
</Window>

后面有一些代码:

void CommandCanExecute(object sender, CanExecuteRoutedEventArgs e) {
    e.CanExecute = true;
}
void CommandExecuted(object sender, EventArgs e) {
    MessageBox.Show("Done!");
}

一切都如我所愿。我可以使用MenuItem或Ctrl+C输入绑定来运行我的命令。

但是现在我的类变得太大了,我决定重构。所以我把代码移到了用户控件后面。这是我的新窗口:

<Window x:Class="SomeNamespace.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:SomeNamespace"
    Height="350" Width="525">
<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="File">
            <MenuItem Command="ApplicationCommands.Copy"/>
        </MenuItem>
    </Menu>
    <my:UserControl1/>
</DockPanel>
</Window>

和UserControl:

<UserControl x:Class="ImageDecompileSandbox.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Copy"
            CanExecute="CommandCanExecute" Executed="CommandExecuted"/>
    </UserControl.CommandBindings>
</UserControl>

基本上,一切都是一样的,除了命令绑定从窗口移动到UserControl,两个命令方法被推到用户控件。

问题:为什么上面不工作?为什么我的用户控制的命令没有被窗口捡起来?我如何从窗口中获得菜单项/键绑定,以便在用户控件中执行命令?

窗口中的菜单项,用户控件中的命令绑定

多亏了dkozl,我才找到了让这个工作的方法。

技巧确实是将命令绑定添加回窗口。我没有在窗口中声明它们,因为窗口不知道用于执行和CanExecute的方法,所以我不能这样做,我只是将控件的所有绑定添加到窗口:

CommandBindings.AddRange(_userControl1.CommandBindings);

我发现这一行hack正是我所需要的,因为它允许我在将命令实现移动到控件时将命令控件和键绑定保留在窗口中。

谢谢你的帮助!