CanExecuteChangedEventManager

CanExecuteChangedEventManager

我不知道如何在 MyCommand : ICommand 中使用 CanExecuteChangedEventManager
我尝试了以下但 value 是错误的类型:

public event EventHandler CanExecuteChanged
{
    add
    {
        CanExecuteChangedEventManager.AddHandler(this, value);
    }
    remove
    {
        CanExecuteChangedEventManager.RemoveHandler(this, value);
    }
}

我正在编写的类看起来像这样,但如果可能的话,没有泄漏:
public class ManualRelayCommand : ICommand
{
    // CanExecute() and Execute() excluded
    public event EventHandler CanExecuteChanged;

    public virtual void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            Application.Current.Dispatcher.InvokeAsync(() => handler(this, EventArgs.Empty));
        }
    }
}

最佳答案

CanExecuteChangedEventManager 是一个支持弱事件模式的类。控件开发人员使用弱事件是很常见的,因为您希望控件不具有对数据的强引用。

CanExecuteChangedEventManager 就是这样使用的。

 public event EventHandler<EventArgs> CanExecuteChanged
 {
    add
    {
        CanExecuteChangedEventManager.AddHandler(this, value);
    }
    remove
    {
        CanExecuteChangedEventManager.RemoveHandler(this, value);
    }
 }

你需要 EventHandler<EventArgs> ,就是这样。

如果您对此仍有疑问,请随时提问:)

编辑:

您不是在创建控件,而是在创建继承自 ICommand 的 RelayCommand。

您不需要 CanExecuteChangedEventManager

当您从 ICommand 继承时,您必须实现 public event EventHandler CanExecuteChanged;
你可以让它这样而不改变它。您也不更改 PropertyChanged 事件,对吗?只要让它在那里,它就会神奇地工作。

允许指挥的控件知道如何订阅该事件。就像来自 INotifyPropertyChanged 接口(interface)的 PropertyChanged 事件一样。 :)

10-07 14:32