【问题标题】:What is a command method in the context of the MVVM pattern using PRISM?在使用 PRISM 的 MVVM 模式的上下文中,什么是命令方法?
【发布时间】:2014-08-01 19:11:32
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

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

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

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

    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>
    

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

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

    【讨论】:

      【解决方案2】:

      我认为“命令方法”是 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; }
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        command 方法是 viewmodel 中的常规方法,它返回 void 并接受一个对象作为参数。

        内存中的示例,因此可能无法编译。这将在视图模型中:

        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 方法。

        【讨论】:

          猜你喜欢
          • 2010-12-26
          • 2010-11-22
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 2019-07-16
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          相关资源
          最近更新 更多