我有一个WPF应用程序中使用此命令(我不喜欢它真的,但如果我要- >我要): http://wpftutorial.net/DelegateCommand.html
但我这里主要的问题是,我并不想要拥有几乎每一行代码的我的一个电话
RaiseCanExecuteChanged()
方法。 所以,我能做什么做汽车一样RoutedUICommand一样。
我有很多数据绑定和作为例子,如果Foo.FooProp!= null命令可以执行。 但我想为更少的代码尽可能,所以我将不得不处处注册事件或更新命令都在我的应用....
你可以实现的一种形式DelegateCommand
它调用代表加入CanExecuteChanged
每次有可能的结果是在UI的变化。 本例使用CommandManager.RequerySuggested
。
public class AutoDelegateCommand : DelegateCommand, ICommand
{
public AutoDelegateCommand(Action<object> execute)
: base(execute)
{
}
public AutoDelegateCommand(Action<object> execute, Predicate<object> canExecute)
: base(execute, canExecute)
{
}
event EventHandler ICommand.CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
我觉得我看到了这样的一个例子之前,也许在MVVMLight工具?
当我使用一个DelegateCommand
,我只是手动提高CanExecuteChanged
中PropertyChange
事件每当属性命令依靠的变化。
下面是我做了前几天一个例子,其中CanExecute
是基于关闭IsLoading
和IsValid
属性:
public MyViewModel()
{
this.PropertyChanged += MyViewModel_PropertyChanged;
}
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "IsLoading":
case "IsValid":
((DelegateCommand)MyCommand).RaiseCanExecuteChanged();
break;
}
}
public ICommand MyCommand
{
get
{
if (_myCommand == null)
_myCommand = new DelegateCommand(Run, CanRun);
return _myCommand;
}
}
public bool CanRun()
{
return this.IsValid && !IsLoading;
}
我觉得这是保持逻辑容易跟踪和维护,并且只检查CanExecuteChanged()
当相关属性改变方法。