我有一个UserControl,它将CommandBinding添加到其CommandBindings集合中以处理特定命令。稍后我在窗口中使用此控件,并希望为该相同的控件添加另一个绑定来添加其他行为。然而,问题在于当我这样做时,似乎当我向控件的CommandBindings集合中添加另一个CommandBinding以处理相同的命令时,它会替换先前已经做出的任何绑定。因此,看起来控件每次只能有一个CommandBinding,是这样吗?
请参见下面的示例代码,尝试为相同的保存命令设置两个CommandBindings。
请参见下面的示例代码,尝试为相同的保存命令设置两个CommandBindings。
<Window x:Class="MultipleCommandBindings.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="Save"
Executed="CommandBinding_Executed" />
<CommandBinding Command="Save"
Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Grid>
<Button Height="23"
HorizontalAlignment="Right"
Margin="0,0,25,88"
Name="button1"
VerticalAlignment="Bottom"
Width="75"
Command="Save">Button</Button>
</Grid>
原本我期望在编写这段代码时会出现编译时或者运行时异常,但出乎意料的是它没有报错。接下来我感到失望的是,我的CommandBinding_Executed处理程序只被调用了一次,而不是我所希望的两次。
更新: 经过一些测试,似乎我的第二个CommandBinding并没有覆盖我的第一个CommandBinding,相反,即使我在事件处理程序中没有将Handled设置为true,第一个命令绑定也会捕获命令。我相信,解决我的问题的方法是理解为什么即使没有将Handled设置为true,路由命令也无法在第一个处理程序之后传播。
更新: 我发现了这个非常有用的信息,它证实了WPF中命令路由背后一些奇怪的行为。
更新: 关于如何解决似乎每个命令只能有一个有效的CommandBinding的问题,一个想法是,似乎默认的CommandBinding类将Executed和CanExecute公开为事件,就像所有事件一样,可以有多个处理程序。那么,除了标准的CommandBindings.Add方法之外,还有其他的方法可以添加命令的其他处理程序。也许这可以通过Control类的扩展方法和自定义的CompositeCommandBinding类来实现,后者允许我们在一个主绑定中聚合多个绑定。