我有一个相关的问题 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 退出触发的唯一方法。我认为这是 Microsoft 实现此功能的一种荒谬方式。如此多的在线示例教您在 XAML 中声明 CommandBindings 的事实只会加剧问题。
关于wpf - 从可视化树中移除元素后,如何触发 commandBinding 的 CanExecute?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2038931/