加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在Action列表中使用多个Actions

发布时间:2020-12-15 23:41:15 所属栏目:百科 来源:网络整理
导读:我正在学习更多关于使用ICommand接口以及如何通过我创建的RelayCommand类执行命令. 首先,我对我想要实现的目标进行了一些研究,但是我找不到任何可以帮助我的东西,或者我真的不知道如何搜索我想要做的事情.另外,我对C#理论的了解并不是很好,所以这对我也不利.
我正在学习更多关于使用ICommand接口以及如何通过我创建的RelayCommand类执行命令.

首先,我对我想要实现的目标进行了一些研究,但是我找不到任何可以帮助我的东西,或者我真的不知道如何搜索我想要做的事情.另外,我对C#理论的了解并不是很好,所以这对我也不利.

基本上我正在尝试将多个动作发送到我的RelayCommand构造函数,然后遍历List< Action< object>>中的所有动作.收集并逐一执行.这是我的代码:

RelayCommand类构造函数

public RelayCommand(Predicate<object> canExecute,List<Action<object>> actions)
{
    _canExecute = canExecute;

    foreach (var action in actions)
        _execute = action;
}

然后我的ViewModel中的命令属性

private ICommand _updateExternals;
public ICommand UpdateExternals
{
    get
    {
        if (_updateExternals == null)
        {
            _updateExternals = new RelayCommand(
                x => CanExecute,Updater.UpdateExternals(this));//Here is where I am stuck
        }
        return _updateExternals;
    }
}

我知道,从其他示例来看,如果我只需要传递一个Action而不是一个Actions列表,那么代码将如下所示:x => Updater.UpdateExternals(本));它会工作,但只要我有一个动作列表作为参数我就会卡住.

所以,如果您还没有猜到,我的问题是:如何通过多个动作发送到我的RelayCommand类?

任何正确方向的帮助将不胜感激,谢谢!

编辑:这是我完整的RelayCommand类,可以更好地了解我在做什么.

public class RelayCommand : ICommand
{
    private Predicate<object> _canExecute;
    private Action<object> _execute;

    public RelayCommand(Predicate<object> canExecute,List<Action<object>> actions)
    {
        _canExecute = canExecute;
        foreach (var action in actions)
            _execute = action;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

解决方法

要解决您的问题,请在构造函数中使用params:

public class RelayCommand : ICommand {
    private Predicate<object> _canExecute;
    private Action<object>[] _execute;

    public RelayCommand(Predicate<object> canExecute,params Action<object>[] actions) {
        _canExecute = canExecute;
        _execute = actions;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter) {
        return _canExecute(parameter);
    }

    public void Execute(object parameter) {
        foreach (var action in _execute)
            action(parameter);
    }
}

然后你可以像往常一样创建这样的命令:

_updateExternals = new RelayCommand(
    x => CanExecute,x => Updater.UpdateExternals(this));//Here is where I am stuck

当您需要传递多个动作时:

_updateExternals = new RelayCommand(
    x => CanExecute,x => Updater.UpdateExternals(this),x => Updater.DoSomethingElse(this));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读