Wpf中Prism模块之间的ApplicationCommands问题

3
我正在使用WPF和Prism。我在Module A中有一个自定义的Canvas DrawingCanvas.cs,我设置了ApplicationCommands.Delete作为命令绑定,如下所示。 this.CommandBindings.Add(newCommandBinding(ApplicationCommands.Delete, Delete_Executed, Delete_Enabled)); 我在另一个Module B中有一个MenuItem“delete”和一个Button“delete”。我在xaml中为它们都设置了命令,如下所示。 <MenuItem Header="Delete" x:Name="menuItemDelete" Command="{x:Static ApplicationCommands.Delete}"
<Button x:Name="buttonDelete" Background="Black"   Height="25" Width="25" ToolTip="Delete" Command="{x:Static ApplicationCommands.Delete}"/>

这里“删除”功能的菜单项按预期正常工作。(如果UI中从DrawingCanvas选择了某些绘图,则菜单项将被启用,并在单击删除菜单项时调用DrawingCanvas.cs中的“Delete_Executed”函数。
但是,删除按钮始终处于禁用状态。当从UI中的DrawingCanvas选择某些绘图时,它不会被启用。 我想知道为什么在同一个视图和同一个模块中,相同的命令适用于菜单项却不适用于按钮。
有人能帮我解决吗?我做错了什么吗?
提前感谢。

我认为按钮需要CommandTarget。话虽如此,我几乎从不以您这种方式工作。由于这是与UI有关的,我可能会使用静态命令并检查焦点或任何逻辑标准应该是什么。如果您不想始终启用按钮,也许您应该考虑这一点。 - Andy
1个回答

0
这里的问题是ApplicationCommands.Delete的CanExecute始终返回false。 有一种解决方法-通过窗口的命令绑定:
<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Delete" CanExecute="CommandBinding_CanExecute"/>
</Window.CommandBindings>

事件处理程序应该如下所示:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

如果您希望始终启用它,或者只需在需要启用时添加条件,它始终可以为真。


不用谢,如果这解决了你的问题,请标记为已回答。 - Raviraj Palvankar
我应该在哪里添加上述事件处理程序和命令绑定?实际上,我已经在DrawingCanvas.cs中有了这个事件处理程序。但是它不会为Button调用,但是它会为同一视图中的MenuItem调用。我不明白为什么会发生这种情况。 - Nik
只需为具有菜单和按钮的窗口或用户控件拥有一个通用事件处理程序。 - Raviraj Palvankar
实际上,在我的场景中,正如我在问题中所解释的那样,事件处理程序(CanExecute、Execute)都在Module A中的DrawingCanvas.cs中,并且菜单项和按钮都在同一个UserControl中的Module B中。因此,对于菜单项,DrawingCanvas.cs中都会调用CanExecute和Executed。但是对于按钮,两者都没有被调用。有什么想法吗? - Nik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接