4

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

4

2 回答 2

2

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

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

解决方案是:

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

B) 处理 Window 或 Control 的 Closed() 事件并调用 this.CommandBindings.Clear()。

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

于 2010-07-13T17:03:45.180 回答
1

我的猜测是命令管理器注册了一个命令实例。命令可以从许多不同的来源执行,而不仅仅是 UI,例如快捷键。

尝试调用 CommandManager.InvalidateRequerySuggested(); 并在您的 canexecute 方法中添加一个断点以确认是这种情况。

希望这可以帮助。

于 2010-01-15T12:38:32.127 回答