我想创建一个特殊的Command类(我称之为DropDownRelayCommand,它将在下拉按钮上使用,该按钮的内容由带命令的按钮组成。
如果启用了内容中没有按钮,则应该禁用(或可能折叠)下拉按钮。我想创建一个通用解决方案。
我无法在XAML中执行此操作(无论如何,无论如何)。
我希望这个DropDownRelayCommand拥有它自己的CanExecute方法,它应该检查其包含命令的所有CanExecute。问题是这个错误(在下面的代码中的标记参数上):非静态字段,方法或属性'Js.Mvvm.DropDownRelayCommand.CanDropDownExecute(T)'需要对象引用。 我不能使用“this”,因为在构造函数中不允许这样做。
这是我的代码(我知道包含命令可能会收到canexecute请求,这使得它有点无效。但通常我只会有一些命令,因此性能可能不那么重要:
public class DropDownRelayCommand<T> : RelayCommand<T>
{
private readonly List<RelayCommand<T>> _commands = new List<RelayCommand<T>>();
private bool _hasAnyCanExecute;
#region Constructors
public DropDownRelayCommand(Action<T> execute, params RelayCommand<T>[] commands)
: base(execute, **CanDropDownExecute**)
{
AddCommandRange(commands);
}
public bool CanDropDownExecute(T argument)
{
_hasAnyCanExecute = false;
foreach (RelayCommand<T> command in _commands)
{
_hasAnyCanExecute = _hasAnyCanExecute || command.CanExecute(argument);
}
return _hasAnyCanExecute;
}
#endregion
#region Public Methods
public void AddCommandRange(params RelayCommand<T>[] commands)
{
if (commands == null) return;
foreach (RelayCommand<T> command in commands)
{
_commands.Add(command);
}
}
public void RemoveCommandRange(params RelayCommand<T>[] commands)
{
if (commands == null) return;
foreach (RelayCommand<T> command in commands)
{
if (_commands.Contains(command))
{
_commands.Remove(command);
}
}
}
#endregion
}