我有一个 WPF UserControl,其中包含一个带有 5 个按钮的工具栏。其中 4 个按钮的命令在父窗口中处理,但第五个按钮的命令由 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" />
用户控件的数据上下文是基于列表选择设置的;所以我将 WIndow->UserControl 绑定到 ListBox->TabControl->Toolbar 按钮
图像会根据命令参数(本例中为 Url)是否为空而变化,这是有效的。但是,该按钮始终处于禁用状态。导致它启用的唯一原因是切换到父选项卡控件中的另一个选项卡,然后使用按钮返回到选项卡。
我尝试调用 CommandManager.InvalidateRequerySuggested();当数据上下文更改并为命令添加“CanAlwaysExecute”处理程序时,但当我调用 CommandManager.InvalidateRequerySuggested(); 时,不会执行 CanExecute 处理程序。
您是否可能在父控件中处理此命令的 CanExecute 事件?如果事件在树上冒泡,则可能在另一个地方用“false”返回值处理它,因此该按钮被禁用。我会尝试处理 UserControl 中的 CanExecute 事件,并在那里设置断点以进一步调查。