【问题标题】:C# ICommand Can ExecuteC# ICommand 可以执行
【发布时间】:2018-07-17 20:31:33
【问题描述】:

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

    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(),以及何时运行这些?我知道如何实现一个事件,我只是想了解它是如何工作的。

【问题讨论】:

    标签: c# wpf interface icommand


    【解决方案1】:

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

    按下按钮时调用Execute

    CanExecute 的条件发生变化时,您可以引发(调用)CanExecuteChanged 事件,以通知 UI 重新查询它。例如,该命令可以是与绑定到网格视图、组合框等的列表集合相关的“清除”命令。如果列表从空变为非空或反之,则引发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&lt;T&gt;BindingList&lt;T&gt;。当列表更改时,两者都会引发事件(请参阅:Difference between ObservableCollection and BindingList)。然后这些命令可以订阅绑定列表事件。 BindingList&lt;T&gt; 的另一个效果是它所绑定的 UI 元素会在列表更改时自动更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多