我有一个WPF用户控件,其中包含一个带有5个按钮的工具栏。用于按钮的命令在父窗口中处理,但第五个按钮的命令由UC本身处理。似乎无论我尝试什么,按钮总是被禁用。这是我的代码:
在用户控件中......
<UserControl.CommandBindings>
<CommandBinding Command="loc:MyAppCommands.OpenUrl" Executed="OpenUrl" />
</UserControl.CommandBindings>
有问题的按钮......
<l49ui:ImageButton Command="loc:MyAppCommands.OpenUrl" CommandParameter="{Binding}" Text="{lex:LocText MyApp.Core:Strings:OpenUrl}" ShowText="False" ToolTip="{lex:LocText MyApp.Core:Strings:OpenUrl}" Style="{StaticResource ToolBarButton}"
Image="{Binding Url,Converter={StaticResource UrlNotNullConverter},ConverterParameter=image}" IsEnabled="true" />
用户控件的datacoontext是根据列表选择设置的;所以我将WIndow-&gt; UserControl绑定到ListBox-&gt; TabControl-&gt;工具栏按钮
图像会根据命令参数(本例中为Url)是否为空而发生变化,这是有效的。但是,该按钮始终处于禁用状态。导致它启用的唯一事情是切换到pareent选项卡控件中的另一个选项卡,然后返回到带有按钮的选项卡。
我试过调用CommandManager.InvalidateRequerySuggested();当datacontext更改并为命令添加“CanAlwaysExecute”处理程序时,但是当我调用CommandManager.InvalidateRequerySuggested();.
时,不会执行CanExecute处理程序。答案 0 :(得分:4)
这可能是焦点范围的问题。尝试在按钮上明确指定CommandTarget属性。将其设置为用户控件中应该引发Execute
和CanExecute
事件的元素(可能是用户控件中的根元素)。
答案 1 :(得分:0)
您是否可以在父控件中处理此命令的CanExecute事件?如果事件冒泡树,可能在另一个地方使用'false'返回值进行处理,因此按钮被禁用。我尝试在UserControl中处理CanExecute事件,并在那里设置断点以进一步调查。