代码之家  ›  专栏  ›  技术社区  ›  Mwspencer

C#ICommand可以执行

  •  2
  • Mwspencer  · 技术社区  · 6 年前

    我试图理解icommand接口。我用一个按钮构建了一个应用程序,该按钮使用一个名为relaycommand的类,该类继承自icommand。这堂课看起来是这样的:

        class RelayCommand : ICommand
    {
        private Action<object> _action;
        public RelayCommand(Action<object> action)
        {
            _action = action;
        }
    
        public bool CanExecute(object parameter)
        {
            return true;
        }
    
        public void Execute(object parameter)
        {
            if(parameter != null)
            {
                _action(parameter);
            }
            else
            {
                _action("Hello World");
            }
        }
    
        //We need to include CanExecuteChange when using the Interface ICommand 
        //In this case it doesn't actually do anything.
        public event EventHandler CanExecuteChanged;
    
    }
    

    每次跟踪函数时,我都会点击CanExecute方法,但现在我在代码中调用这个方法我创建了一个RelayCommand实例,如下所示:

    Btn_AcceptedAnswer = new RelayCommand(new Action<object>(AcceptedAnswer_OnClick));
    

    所以我的问题是,当RelayCommand启动时,它如何知道运行CanExecute()和Execute(),以及何时运行这些命令我知道如何实现一个事件,我只是想了解它是如何工作的。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Olivier Jacot-Descombes    6 年前

    调用的是ui(wpf) CanExecute 了解是否必须启用与命令关联的按钮。

    Execute 当按下按钮时调用。

    你可以提出(调用) CanExecuteChanged 事件时的条件 CanExecute公司 更改,通知用户界面重新查询。例如,该命令可以是与绑定到网格视图、组合框等的列表集合相关的“清除”命令如果列表从空变为非空,或者从非空变为非空,则 CanExecuteChanged公司 . 当然,只有当列表不为空时,按钮才会被启用。

    public bool CanExecute(object parameter)
    {
        return myList.Count > 0;
    }
    
    private void OnCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }
    
    public void Execute(object parameter)
    {
        if(myList.Count > 0) {
            myList.Clear();
            OnCanExecuteChanged();
        }
    }
    

    向列表中添加元素时,还应触发事件然而,这更为棘手,因为这很可能发生在另一个命令中你需要一种方式来沟通两者一个好的方法是使用 ObservableCollection<T> 或者 BindingList<T> 是的。当列表更改时,两者都会引发事件(请参见: Difference between ObservableCollection and BindingList )中。然后,这些命令可以订阅绑定列表事件附加效应 绑定列表<T> 是它绑定到的UI元素,在列表更改时自动更新。