使用PRISM的MVVM模式上下文中的命令方法是什么?

时间:2014-08-01 19:11:32

标签: c# wpf mvvm prism

阅读以下信息,我仍然对Command方法而不是Command对象的含义感到困惑。 http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx#sec10

给出的唯一示例,以及我通过搜索找到的唯一示例显示命令对象的示例。有人可以发布一个绑定到命令方法的按钮示例,或者指向其他地方的示例吗?它只是视图模型类的常规方法,视图模型类的静态方法,还是完全不同的其他方法?

3 个答案:

答案 0 :(得分:6)

啊,我想通了。问题是从棱镜4开发者指南中完全删除了一个部分,该部分已经存在于Prism 4文档中。直到我打开了我在计算机上本地保存的旧Prism 4 PDF时,我感到很困惑。

以下是Prism 4开发人员指南中的示例:

从视图调用命令方法 将命令实现为ICommand对象的另一种方法是将它们简单地实现为方法 视图模型然后使用行为直接从视图中调用这些方法。 这可以通过与从行为调用命令类似的方式实现,如上一节所示。 但是,您使用CallMethodAction而不是使用InvokeCommandAction。以下代码示例调用 底层视图模型上的(无参数)Submit方法。

XAML

<Button Content="Submit" IsEnabled="{Binding CanSubmit}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <i:CallMethodAction TargetObject="{Binding}" Method="Submit"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>

使用{Binding}将TargetObject绑定到基础数据上下文(即视图模型) 表达。 Method参数指定要调用的方法。 注意: CallMethodAction不支持参数;如果你需要将参数传递给目标方法,你有 要在视图模型上提供值作为属性,请切换到使用带有的命令 InvokeCommandAction,或编写您自己的将传递参数的CallMethodAction版本。

似乎许多人更喜欢命令对象概念,但我对新手册明确列出两个选项但只描述其中一个这一事实感到困惑!

答案 1 :(得分:-1)

我认为&#34;命令方法&#34;它的CompositeCommand。

CompositeCommand是ICommand的一个实现,因此它可以绑定到调用者。 CompositeCommands可以连接到几个子命令;调用CompositeCommand时,也会调用子命令。

CompositeCommands支持启用。 CompositeCommands侦听每个连接命令的CanExecuteChanged事件。然后它会引发此事件通知其调用者。调用者通过在CompositeCommand上调用CanExecute来对此事件做出反应。然后,CompositeCommand通过在每个子命令上调用CanExecute来再次轮询其所有子命令。如果对CanExecute的任何调用返回false,则CompositeCommand将返回false,从而禁用调用者。

(Prism 4.0自述文件第9章:松散耦合组件之间的通信)

示例:

public class MyViewModel : NotificationObject
{

    private readonly CompositeCommand saveAllCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.saveAllCommand = new CompositeCommand();
        this.saveAllCommand.RegisterCommand(new SaveProductsCommand());
        this.saveAllCommand.RegisterCommand(new SaveOrdersCommand());
    }

    public ICommand SaveAllCommand
    {
        get { return this.saveAllCommand; }
    }
}

答案 2 :(得分:-1)

命令方法是执行命令时由命令对象调用的方法。

命令方法是viewmodel中的常规方法,它返回void并将对象作为参数。

来自内存的示例因此可能无法编译。这将在viewmodel中:

private DelegateCommand _doSomethingCommand;

public DoSomethingCommand {
    get {
        return _doSomethingCommand;
    }
}

public MyViewModel() {
    _doSomethingCommand = new DelegateCommand(OnDoSomething);
}

private void OnDoSomething(object o) {
    // Do something here
}

在你的标记中

<Button Content="Click to do something" Command={Binding DoSomethingCommand}/>

单击该按钮时,将调用OnDoSomething方法。