0

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

但是我花了最后一段时间试图让这个简单的样本工作。要么我从根本上误解了(这不是第一次),要么出了点问题。

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

将 CommandBinding 添加到 Window 可以很好地启用按钮,但这会扼杀特定于项目的 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)。

这应该如何工作?

先感谢您。

4

3 回答 3

0

我看不出这是如何工作的,而且您似乎错过了重点(抱歉)- CommandBindings 应该应用于父元素(将其放在画布上也可以)。单击按钮时,RoutedCommand 将通过可视化树“冒泡”,这意味着任何父元素都将触发绑定到该命令的事件。按钮保持禁用状态的原因是您此时无法执行打开命令,并且由于它不在执行路径中,因此未评估 CommandBinding。看这里:

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

于 2010-06-21T16:16:29.907 回答
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-command 可以有不同的含义(一个可能会打开一个文件 - 在另一个它将打开在 ListView 中选择的项目等等)。

在我的示例中 - 在 TextBox A 或按钮具有焦点时按 CTRL+O 将触发“Hello”消息框。但请阅读 Leom 链接到的页面以获得更深入的解释。

于 2010-06-21T19:51:08.233 回答
0

MSFT 在他们的 WPF 论坛中给了我正确的答案,这里是http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bb3d1eb1-96fa-4fbc-beda-799613acb9f7

于 2011-03-09T19:59:22.547 回答