gpt4 book ai didi

C# ICommand 可以执行

转载 作者:行者123 更新时间:2023-11-30 20:25:36 26 4
gpt4 key购买 nike

我试图理解 ICommand 接口(interface)。我构建了一个带有按钮的应用程序,该按钮使用了一个名为 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(),以及何时运行它们?我知道如何实现一个事件,我只是想了解它是如何工作的。

最佳答案

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

Execute按下按钮时调用。

您可以引发(调用)CanExecuteChanged条件为 CanExecute 时的事件更改,以通知 UI 重新查询它。例如,该命令可以是与绑定(bind)到 GridView 、组合框等的列表集合相关的“清除”命令。如果列表从空变为非空,反之亦然,则提高 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)。然后命令可以订阅绑定(bind)列表事件。 BindingList<T>的附加效果是它绑定(bind)到的 UI 元素,在列表更改时自动更新。

关于C# ICommand 可以执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com