【问题标题】:Can I call a command inside a command?我可以在命令中调用命令吗?
【发布时间】:2011-07-06 18:33:15
【问题描述】:

我在视图模型中为我的对话窗口定义了一个关闭命令。我在该视图模型中定义了另一个命令。现在,我将该命令绑定到视图中的控件。执行某些命令操作后,我希望它调用 closecommand 来关闭窗口。这可能吗?

【问题讨论】:

  • 你在谈论 WPF?如果你不这样做,请恢复我的编辑。

标签: c# wpf mvvm command icommand


【解决方案1】:

是的。您可以使用 CompositeCommand 包装两个(或任意数量)您的其他命令。我相信这是在 Prism 中,但是如果您在项目中无法访问它,那么自己实现类似的功能并不是非常困难,特别是如果您不使用参数 - 您所做的就是实现 ICommand有一个类,然后在类中有一个私有的 ICommand 列表。

这里有更多关于 Prism 的 CompositeCommand 类的信息:

http://msdn.microsoft.com/en-us/library/microsoft.practices.composite.presentation.commands.compositecommand_members.aspx

下面是我自己公认的简短且可能不规范的实现。要使用它,您需要做的就是在您的 VM 上引用它,然后绑定到它。您可以为要运行的所有其他命令调用 .AddCommand。 Prism 的实施方式可能有所不同,但我相信这会奏效:

    public class CompositeCommand : ICommand {

    private List<ICommand> subCommands;

    public CompositeCommand()
    {
        subCommands = new List<ICommand>();
    }

    public bool CanExecute(object parameter)
    {
        foreach (ICommand command in subCommands)
        {
            if (!command.CanExecute(parameter))
            {
                return false;
            }
        }

        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        foreach (ICommand command in subCommands)
        {
            command.Execute(parameter);
        }
    }

    public void AddCommand(ICommand command)
    {
        if (command == null)
            throw new ArgumentNullException("Yadayada, command is null. Don't pass null commands.");

        subCommands.Add(command);
    }
}

【讨论】:

  • 您能否详细说明如何在不使用 Prism 的情况下执行此操作?
  • 当然。给我一秒钟,让我想出一个解决方案。
  • 我喜欢 linq:return subCommands.Any(x =&gt; x.CanExecute(parameter) == false)
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
相关资源
最近更新 更多