相关疑难解决方法(0)

Josh Smith对RelayCommand的实施有缺陷吗?

考虑参考Josh Smith的文章WPF Apps with Model-View-ViewModel Design Pattern,特别是a的示例实现RelayCommand(图3).(无需阅读整篇文章以了解此问题.)

在一般情况下,我想实现是优秀的,但我有一个代表团的问题CanExecuteChanged订阅到CommandManagerRequerySuggested事件.各州的文件RequerySuggested:

由于此事件是静态的,因此它只会作为弱引用保留在处理程序中.侦听此事件的对象应该对其事件处理程序保持强引用,以避免它被垃圾回收.这可以通过拥有私有字段并在附加到此事件之前或之后将处理程序指定为值来实现.

然而,示例实现RelayCommand不会对订阅的处理程序维护任何此类:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是否泄漏了弱RelayCommand客户端的漏洞,要求用户RelayCommand了解自己的实施CanExecuteChanged并维护一个实时参考?
  2. 如果是这样,例如,修改实现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; …
    Run Code Online (Sandbox Code Playgroud)

wpf weak-references mvvm relaycommand icommand

41
推荐指数
4
解决办法
1万
查看次数

标签 统计

icommand ×1

mvvm ×1

relaycommand ×1

weak-references ×1

wpf ×1