当一个元素从可视树中移除后,如何使命令绑定的CanExecute事件触发?

4

我有一个相关的问题在这里,我有一个带有命令绑定的用户控件。用户控件已从可视树中删除,但canExecute仍在触发。我对命令模型的理解是它像路由事件一样冒泡和隧道传播。那么,当带有命令绑定的元素不再在可视树中时,如何触发CanExecute?

2个回答

2

我认为,在WPF中,CommandBindings的实现非常糟糕。如果控件有CommandBinding,即使控件关闭了,系统仍会保留对其的WeakReference,这一点需要注意。

你可能会在网上看到很多关于如何在XAML代码中设置CommandBinding的示例。问题是,所有这些示例都会给任何应用程序引入性能问题。CommandBindings无法自行正确清除。至少要很长时间才能清除。

解决方法是:

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

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

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


这意味着您不应在用户控件上声明命令绑定(因为您没有关闭事件),否则可能会导致内存问题。 - Aran Mulholland

1

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

尝试调用CommandManager.InvalidateRequerySuggested(); 并在canexecute方法中添加断点以确认这一点。

希望这能帮到你。


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