WPF CommandBinding不在顶级项目/ Window / this上

时间:2010-06-21 15:48:12

标签: wpf icommand commandbinding

我想要的只是不同选项卡上的不同绑定,因此切换选项卡会切换命令可用性。我认为CommandBindings就是这样的。

但我花了最后一次试图让这个简单的样本起作用。要么我从根本上误解(这不会是第一次)或者是错误的。

我将一个CommandBinding添加到textBoxA但不添加到textBoxB。在它们之间移动应该启用和禁用设置为相应命令的按钮。

将CommandBinding添加到窗口可以使按钮正常,但这样会杀死特定于项目的CommandBindings的整个点。

使用此XAML

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="500">
    <Canvas>
        <Button Canvas.Left="31" Canvas.Top="24" Content="Click Me" Name="button1" Width="100"/>
        <TextBox Canvas.Left="155" Canvas.Top="22" Height="23" Name="textBoxA" Width="120" Text="A" />
        <TextBox Canvas.Left="298" Canvas.Top="22" Height="23" Name="textBoxB" Width="120" Text="B" />
    </Canvas>
</Window>

使用此代码

public MainWindow()
{
    InitializeComponent();

    button1.Command = ApplicationCommands.Open;

    var _Binding = new CommandBinding(button1.Command);
    textBoxA.CommandBindings.Add(_Binding);
    textBoxB.CommandBindings.Clear(); // nothing bound

    _Binding.CanExecute += (s, e) =>
    {
        e.CanExecute = true;
    };

    _Binding.Executed += (s, e) =>
    {
        MessageBox.Show("Hello");
    };
}

您将看到(如果您尝试此代码)按钮保持禁用状态,即使您从一个文本框移动到另一个文本框也是如此。 (即使textBoxA应该启用按钮,因为它实现了按钮的CommandBinding。)

这应该如何运作?

提前谢谢。

3 个答案:

答案 0 :(得分:0)

我无法看到这是如何工作的,似乎你错过了这一点(对不起) - CommandBindings应该应用于父元素(将它放在画布上也可以)。单击该按钮后,RoutedCommand将通过可视树“冒泡”,这意味着任何父元素都将触发已绑定到此命令的事件。按钮保持禁用的原因是因为您无法在该点执行open命令并且CommandBinding未被评估,因为它不在执行路径中。看到这里:

http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

答案 1 :(得分:0)

我会试着看看我是否可以点击你的情景:

<Canvas>
    <Button ... Command="Open">
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </Button>
    <TextBox ... >
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </TextBox>
    <TextBox ... />
</Canvas>

在代码隐藏中:

private void OnOpen(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Hello");
}

CommandBindings的想法是一个捷径,让公共键击可以跨越按钮和上下文中的其他控件(通常是用户控件)。然后每个区域对于Open命令可以有不同的含义(一个可能会打开一个文件 - 在另一个区域中它将打开在ListView中选择的项目,等等。)

在我的例子中 - 当TextBox A或按钮具有焦点时按CTRL + O将触发'Hello'MessageBox。但请阅读Leom链接的页面以获得更深入的解释。

答案 2 :(得分:0)