在使用PRISM的MVVM模式上下文中,什么是命令方法
本文关键字:什么 方法 命令 上下文 模式 PRISM MVVM | 更新日期: 2023-09-27 18:15:56
阅读以下信息,我仍然对Command方法与Command对象的区别感到困惑。http://msdn.microsoft.com/en-us/library/gg405484 (v = pandp.40) . aspx # sec10
给出的唯一示例,以及我可以通过搜索找到的唯一示例显示了命令对象的示例。有人可以张贴一个按钮绑定到命令方法的例子,或指向我到其他地方的例子?它只是视图模型类的常规方法,视图模型类的静态方法,还是其他完全的东西?
啊,我明白了。问题是Prism 5开发人员指南中存在于Prism 4文档中的部分被完全删除了。我一直很困惑,直到我打开保存在电脑上的旧Prism 4 PDF文件。
下面是来自Prism 4开发人员指南的示例:
从视图调用命令方法 将命令实现为iccommand对象的另一种方法是将它们简单地作为方法实现然后使用行为直接从视图调用这些方法。这可以通过类似于从行为调用命令的方式实现,如前一节所示。但是,您使用的不是InvokeCommandAction,而是CallMethodAction。下面的代码示例调用底层视图模型上的(无参数)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>
TargetObject通过使用{Binding}绑定到底层数据上下文(即视图模型)。表达式。Method参数指定要调用的方法。注意:CallMethodAction不支持参数;如果需要将参数传递给目标方法,则需要要将值作为视图模型上的属性提供,请切换到使用带有属性的命令
命令对象的概念似乎被许多人所偏爱,但我被新手册明确列出了两个选项但只描述了其中一个的事实所迷惑!
我想"Command method"应该是CompositeCommand。
CompositeCommand是iccommand的一个实现,因此它可以绑定到调用者。复合命令可以连接到几个子命令;当调用CompositeCommand时,也会调用子命令。
compositcommands支持启用。compositcommands监听它所连接的每一个命令的CanExecuteChanged事件。然后,它引发此事件,通知其调用者。调用者通过在CompositeCommand上调用CanExecute来响应此事件。然后,CompositeCommand通过对每个子命令调用CanExecute,再次轮询它的所有子命令。如果对CanExecute的任何调用返回false,则CompositeCommand将返回false,从而禁用调用者。
(Prism 4.0 Readme Chapter 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; }
}
}
命令方法是命令对象在执行命令时调用的方法。
command方法是视图模型中的一个常规方法,它返回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方法被调用