使用 Prism 的 Wpf 中模块之间的 ApplicationCommands 问题

Posted

技术标签:

【中文标题】使用 Prism 的 Wpf 中模块之间的 ApplicationCommands 问题【英文标题】:Issues with ApplicationCommands between modules in Wpf with Prism 【发布时间】:2019-05-14 06:12:06 【问题描述】:

我正在使用带有 Prism 的 WPF。 我在 Module A 中有一个自定义 Canavs DrawingCanvas.cs,我已将 ApplicationCommands.Delete 设置为命令绑定,如下所示。

this.CommandBindings.Add(newCommandBinding(ApplicationCommands.Delete, Delete_Executed, Delete_Enabled));

我有另一个 Module B,其中有一个 MenuItem 删除,还有另一个 Button 用于删除。我已经为两者设置了 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"/>

这里 MenuItem 删除工作正常。(MenuItem 将在从 UI 中的 DrawingCanvas 中选择某些绘图时启用,并且在 Delete 时将调用 DrawingCanvas.cs 中的“Delete_Executed”菜单项点击)

但删除按钮始终禁用。在 UI 中的 DrawingCanvas 中选择某些绘图时,它不会启用。 我想知道为什么相同的命令适用于 MenuItem 但不适用于同一视图和同一模块中的 Button。

谁能帮我解决这个问题?我做错什么了吗?

提前致谢。

【问题讨论】:

我认为按钮需要命令目标。话虽如此,我几乎从不按照你的方式工作。由于这取决于 UI,我可能会使用静态命令并检查焦点或逻辑标准应该是什么。如果您不想一直启用您的按钮,也许您应该考虑这一点。 【参考方案1】:

这里的问题是 ApplicationCommands.Delete 的 CanExecute 总是返回 false。有一种方法可以解决这个问题 - 通过 Window 的命令绑定:

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Delete" CanExecute="CommandBinding_CanExecute"/>
</Window.CommandBindings>

事件处理程序如下所示:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)

    e.CanExecute = true;

如果您希望始终启用它,或者只是添加您的条件,就像您希望它启用时一样。

【讨论】:

不客气,如果这解决了您的问题,请标记为已回答。 我应该在哪里添加上面的事件处理程序和命令绑定?实际上我已经在 DrawingCanvas.cs 中有这个事件处理程序。但它不会被 Button 调用,而是在同一个视图中被 MenuItem 调用。我不明白为什么会这样。 只有一个用于窗口或用户控件的通用事件处理程序,它具有菜单和按钮。 实际上在我的场景中,正如我在问题中解释的那样,两个事件处理程序(CanExecute,Execute)都在 Module ADrawingCanvas.cs 和菜单中项目和按钮在 Module B 内的同一个 UserControl 中。因此,对于 MenuItem,CanExecute 和 Executed 都在 DrawingCanvas.cs 中被调用。但是对于 Button 两者都没有被调用。知道为什么吗?

以上是关于使用 Prism 的 Wpf 中模块之间的 ApplicationCommands 问题的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-11 WPF上位机 63-Prism框架模块化(Shell,Region)

Prism for WPF再探(基于Prism事件的模块间通信)

Prism/MVVM (MEF/WPF):从模块中公开导航 [例如菜单]

2021-10-13 WPF上位机 64-Prism框架模块化(Module,Dialog)

Prism.WPF -- Prism框架使用(上)

Prism入门之模块(Module)