【问题标题】:WPF: Command Is DisabledWPF:命令被禁用
【发布时间】:2011-04-03 17:12:37
【问题描述】:

我有一个 WPF 用户控件,其中包含一个带有 5 个按钮的工具栏。按钮的 for 的命令在父窗口中处理,但第五个按钮的命令由 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


    【解决方案1】:

    这可能是焦点范围的问题。尝试在按钮上明确指定 CommandTarget 属性。将其设置为用户控件内的一个元素,在该元素上应该引发 ExecuteCanExecute 事件(可能是用户控件内的根元素)。

    【讨论】:

    • 谢谢,命令对我来说一直是一个有点模糊的理解领域。
    • 这是预期的行为还是错误?我开始怀疑 WPF 是否真的值得;它做了很多复杂的事情,但几乎所有过去很简单或只是在 WinForms 中工作的东西,在 WPF 中都被牺牲了,以使这些复杂的事情正常工作。
    • @romkyns - 好吧,如果我没记错的话,这是预期的行为。例如,有关焦点范围如何工作的一些信息,请参阅以下答案:stackoverflow.com/questions/4954253/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2018-11-18
      • 2011-07-15
      相关资源
      最近更新 更多