命令绑定 - 在 WPF 应用程序中,即使窗口关闭,CanExecute() 仍然会被调用

6
我有一个工具栏,它有自己的视图模型。我使用命令绑定来处理视图模型中的单击事件。我使用了CodePlex的工具包提供的命令类。当我关闭窗口并在同一应用程序中打开另一个窗口时,我发现先前关闭的窗口的CanExecute()方法被调用了。我使用CommandManager.InvalidateRequerySuggested()确认了CommandManager仍然保持引用。CommandManager应该持有弱引用,但由于某种原因它根本没有释放委托。
我在这里做错了什么?如何解决这个问题?
2个回答

5
这种情况发生的原因是CommandManager不知道在处理程序被垃圾回收之前应停止触发CanExecute事件。
我曾遇到同样的问题,通过在关闭窗口后将窗口的DataContext设置为null来解决该问题。假定命令绑定到ViewModel,则此方法有效(删除DataContext会注销canExecute事件处理程序)。

0
作为对 surfen 回答的补充,我最终通过添加以下代码行解决了这个问题。
CommandBindings.Clear()

在我的窗口的 Closed 事件中。如果你的命令绑定都是在窗口上创建的,那么这应该能正常工作;否则,你应该在拥有 CommandBindings 的任何控件上调用它。

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