我不知道如何在 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 事件一样。 :)