【发布时间】:2018-04-13 12:37:04
【问题描述】:
我正在学习更多关于使用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 而不是操作列表,则代码将如下所示:x => Updater.UpdateExternals(this)); 并且它会起作用,但只要我有一个动作列表作为我卡住的参数。
所以,如果您还没有猜到,我的问题是:如何通过多个 Action 向我的 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);
}
}
【问题讨论】:
-
为什么
Predicate<object>(类似于Func<object, bool>)叫canExecute?遍历actions并将它们中的每一个(不调用它们)分配给同一个字段,这就是你对foreach (var action in actions) _execute = action;所做的,似乎没有用?我不太了解你的工作。 -
Updater.UpdateExternals 长什么样子?
-
只需在列表中循环您的元素并调用委托:
foreach(a in myList) a(myParams);但是为什么您在RelayCommand-constructor 中的每次迭代中都会过度使用_execute-字段? -
@JeppeStigNielsen 感谢 Jeppe 的评论。我已经编辑了我的问题,以便它可以更多地解释我在做什么。
-
@Evk 这可能是我试图调用的任何方法。我已经编辑了我的问题,因此它可以帮助更多地了解我正在尝试做的事情。感谢您的评论。