我正在尝试使用自定义delegate command
但是,自动RaiseCanExecuteChanged不能正常工作。使用CommandManagerHelper (每次应用程序处于焦点时,它都可以为每个命令执行更改)是好的吗?或者我必须使用标准的RelayCommand并提高我自己的可执行能力?
谢谢
发布于 2013-06-14 18:35:20
RaiseCanExecuteChanged事件在自动模式下不能正常工作。因此,对于每个UI交互,都有这样的实现来刷新RequerySuggested事件的canExecute处理程序。代码如下(请记住,ICommand的这种实现不是性能有效的,但工作起来很棒):
public class Command<TArgs> : ICommand
{
public Command(Action<TArgs> exDelegate)
{
_exDelegate = exDelegate;
}
public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate)
{
_exDelegate = exDelegate;
_canDelegate = canDelegate;
}
protected Action<TArgs> _exDelegate;
protected Func<TArgs, bool> _canDelegate;
#region ICommand Members
public bool CanExecute(TArgs parameter)
{
if (_canDelegate == null)
return true;
return _canDelegate(parameter);
}
public void Execute(TArgs parameter)
{
if (_exDelegate != null)
{
_exDelegate(parameter);
}
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
bool ICommand.CanExecute(object parameter)
{
if (parameter != null)
{
var parameterType = parameter.GetType();
if (parameterType.FullName.Equals("MS.Internal.NamedObject"))
return false;
}
return CanExecute((TArgs)parameter);
}
void ICommand.Execute(object parameter)
{
Execute((TArgs)parameter);
}
#endregion
}发布于 2013-06-17 16:55:19
最好的解决方案是使用RelayCommand并手动提升CanExecuteChanged。另一种解决方案无法正常工作。
https://stackoverflow.com/questions/17105462
复制相似问题