WPF ViewModel RelayCommand继承

时间:2013-12-06 08:37:45

标签: c# wpf inheritance mvvm

我想创建一个特殊的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

}

0 个答案:

没有答案