考虑参考Josh Smith 的文章 WPF Apps With The Model-View-ViewModel Design Pattern,特别是 a 的示例实现RelayCommand
(在图 3 中)。(这个问题不需要通读整篇文章。)
总的来说,我认为实现非常好,但我对'事件的CanExecuteChanged
订阅委托有疑问。状态的文档:CommandManager
RequerySuggested
RequerySuggested
由于此事件是静态的,它只会将处理程序作为弱引用。侦听此事件的对象应保持对其事件处理程序的强引用,以避免它被垃圾收集。这可以通过拥有一个私有字段并将处理程序分配为附加到此事件之前或之后的值来完成。
然而,示例实现RelayCommand
并没有对订阅的处理程序进行任何维护:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- 这是否将弱引用泄漏给
RelayCommand
客户端,要求用户自己RelayCommand
了解实现CanExecuteChanged
并维护实时引用? 如果是这样,是否有意义,例如,将 的实现修改为
RelayCommand
如下所示,以减轻CanExecuteChanged
订阅者潜在的过早 GC:// This event never actually fires. It's purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; this.canExecChangedRef += value; } remove { this.canExecChangedRef -= value; CommandManager.RequerySuggested -= value; } }