WPF:命令被禁用

问题描述 投票:0回答:2

我有一个 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 处理程序。

c# .net wpf command
2个回答
4
投票

这可能是焦点范围的问题。尝试在按钮上显式指定 CommandTarget 属性。将其设置为用户控件内应引发

Execute
CanExecute
事件的元素(可能是用户控件内的根元素)。


0
投票

您是否可能在父控件中处理此命令的 CanExecute 事件?如果事件在树上冒泡,则可能在另一个地方用“false”返回值处理它,因此该按钮被禁用。我会尝试处理 UserControl 中的 CanExecute 事件,并在那里设置断点以进一步调查。

© www.soinside.com 2019 - 2024. All rights reserved.