wpf - 一旦元素从可视化树中删除,commandBinding 的 CanExecute 如何触发?

标签 wpf routed-commands commandbinding visual-tree

我有一个相关问题here我有一个带有命令绑定(bind)的用户控件。用户控件已从可视化树中删除,但 canExecute 仍在触发。我对指挥模型的理解是,它像路由事件一样冒泡和隧道。那么,一旦附加了命令绑定(bind)的元素不再位于可视化树中,CanExecute 如何触发呢?

最佳答案

IMO,CommandBindings 在 WPF 中的实现确实很差。您必须解决这样一个事实:如果系统具有 CommandBinding,系统会保留对您的控件的 WeakReference,即使控件已关闭也是如此。

您将在网上看到很多有关如何在 XAML 代码中设置 CommandBinding 的示例。问题是所有这些示例都会在粘贴它们的任何应用程序中引入性能问题。 CommandBindings 永远不会自行正常消失。至少,在很长一段时间内不会。

解决办法是:

A) 不要在 XAML 中设置 CommandBindings。您必须使用后面的代码。建议在调用InitializeComponent()之后使用构造函数。使用 this.CommandBindings.Add() 通过代码添加 CommandBindings。

B) 处理窗口或控件的 Closed() 事件并调用 this.CommandBindings.Clear()。

这是我能够可靠地让 CommandBindings 停止触发的唯一方法。我认为微软以这种方式实现此功能是一种荒谬的方式。事实上,如此多的在线示例教您在 XAML 中声明 CommandBindings 只会加剧问题。

关于wpf - 一旦元素从可视化树中删除,commandBinding 的 CanExecute 如何触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2038931/

相关文章:

wpf - 使用 UpdateSourceTrigger=PropertyChanged 绑定(bind)到 Decimal 的 TextBox

c# - 将按钮添加到数据模板并调用其点击事件

WPF - 自定义控件 + ICommand(如何实现)?

c# - MVVM模式的哪一部分负责数据网格的分组

c# - 使用 Prism 库将 ListView 项传递给命令

c# - 无法将路由命令添加到 WPF 中的复选框

c# - 在一个窗口中定义的 WPF CommandBindings 在另一窗口中不可用

c# - WPF 将多个参数传递给命令

c# - DataGrid 保存按钮和 CanExecute

c# - 编辑 wpf 控件模板但使用原始样式