我想要的只是不同选项卡上的不同绑定,因此切换选项卡会切换命令可用性。我认为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。)
这应该如何运作?
提前谢谢。
答案 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)