C# WPF ViewModel RelayCommand继承

C# WPF ViewModel RelayCommand继承,c#,wpf,inheritance,mvvm,C#,Wpf,Inheritance,Mvvm,我想创建一个特殊的命令类,我称之为DropDownRelayCommand,它将用于一个下拉按钮,该按钮的内容由带有命令的按钮组成 其想法是,如果下拉按钮的内容中没有按钮被启用,则下拉按钮应该被禁用或可能被折叠。我想创建一个通用解决方案 无论如何,我无法在XAML中以通用的方式完成这项工作 我希望这个DropDownRelayCommand有自己的CanExecute方法,它应该检查所有包含命令的CanExecute。问题在于下面代码中标记的参数出现了此错误:非静态字段、方法或属性“Js.Mvv

我想创建一个特殊的命令类,我称之为DropDownRelayCommand,它将用于一个下拉按钮,该按钮的内容由带有命令的按钮组成

其想法是,如果下拉按钮的内容中没有按钮被启用,则下拉按钮应该被禁用或可能被折叠。我想创建一个通用解决方案

无论如何,我无法在XAML中以通用的方式完成这项工作

我希望这个DropDownRelayCommand有自己的CanExecute方法,它应该检查所有包含命令的CanExecute。问题在于下面代码中标记的参数出现了此错误:非静态字段、方法或属性“Js.Mvvm.DropDownRelayCommand.CanDropDownExecuteT”需要对象引用。 我不能使用它,因为构造函数中不允许使用它

这是我的代码,我知道包含命令的命令可能会接收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

}

是否确实需要从此处的RelayCommand派生命令?我们到底在谈论什么样的社区?我的问题是要找出为什么需要将CanExecute逻辑作为委托传递,而不仅仅是重写继承的方法。RelayCommand的设计目的不是这样使用,它是为了让您通过委托访问命令。我认为您应该创建一个实现ICommand的类。