我有一个相关的问题在这里,我有一个带有命令绑定的用户控件。用户控件已从可视树中删除,但canExecute仍在触发。我对命令模型的理解是它像路由事件一样冒泡和隧道传播。那么,当带有命令绑定的元素不再在可视树中时,如何触发CanExecute?
我有一个相关的问题在这里,我有一个带有命令绑定的用户控件。用户控件已从可视树中删除,但canExecute仍在触发。我对命令模型的理解是它像路由事件一样冒泡和隧道传播。那么,当带有命令绑定的元素不再在可视树中时,如何触发CanExecute?
我认为,在WPF中,CommandBindings的实现非常糟糕。如果控件有CommandBinding,即使控件关闭了,系统仍会保留对其的WeakReference,这一点需要注意。
你可能会在网上看到很多关于如何在XAML代码中设置CommandBinding的示例。问题是,所有这些示例都会给任何应用程序引入性能问题。CommandBindings无法自行正确清除。至少要很长时间才能清除。
解决方法是:
A)不要在XAML中设置CommandBindings。必须使用代码后台。建议在调用InitializeComponent()之后使用构造函数。使用this.CommandBindings.Add()使用代码添加CommandBindings。
B)处理窗口或控件的Closed()事件,并调用this.CommandBindings.Clear()。
这是我能够可靠地让CommandBindings停止触发的唯一方法。我认为这是微软实现此功能的荒谬方式。这么多在线示例教你在XAML中声明CommandBindings只会加剧问题。
我猜测在命令管理器中注册了该命令的实例。命令可以从许多不同的来源执行,而不仅仅是UI,例如快捷键。
尝试调用CommandManager.InvalidateRequerySuggested(); 并在canexecute方法中添加断点以确认这一点。
希望这能帮到你。