ICommands如何以及在哪里适合整体WPF MVVM模式?

我试图学习如何使用WPF命令,以及它们如何适应MVVM模式。 我知道某些控件(如按钮或菜单)具有一个Command属性,该属性在设置为ICommand类的实例时将按钮连接到该命令。 一旦设置完成,该按钮就会通过命令的CanExecuteChanged事件关闭并启用,然后单击该控件将调用该命令的Execute方法。

但是,每个ICommand的实例应该在哪里生存? 我在教程中看到了各种不同的选项,我不确定哪个是正确的。 在一些示例中,创建一个静态的“ApplicationCommands”类,并将每个命令的一个实例分配给该类的静态属性。 在其他例子中,我已经看到命令设置为ViewModel的属性,在其他视图/窗口本身。 命令实例的首选位置是什么?

另外,如何将命令与视图,视图模型或模型关联起来? 命令应该知道和/或操纵哪些组件? 命令执行时会发生什么? 是否应该调用模型的某些方法,然后将变化传回View Model / View? 还是应该通过视图模型的方法与模型通信?


在一些示例中,创建一个静态的“ApplicationCommands”类,并将每个命令的一个实例分配给该类的静态属性

您可以为您想要从任何地方访问的命令执行此操作。 例如,如果你想要一个F1的键绑定来总是显示一个帮助屏幕,那么你可以在一个全局可访问的点上执行这个命令,然后从各个屏幕绑定它。

看到的命令被设置为ViewModel的属性,以及View / Window本身的其他属性。

如果该命令正在处理数据,那么ViewModel是一个好的选择。 如果该命令不需要对数据执行任何操作,那么将其放入View的代码中(因为它与ViewModel无关,并且不需要使用它来污染ViewModel)。 一个有趣的例子是,当你正在做一些响应按键弹出对话框的事情时,你需要将当前选中的网格项传递给对话框 - 命令应该放在哪里? 在这种情况下,我会将它放在视图后面的代码中,因为没有强制性的理由将其放入ViewModel中 - 如果需要,可以通过视图从ViewModel中检索选定的项目。

很多时候,我看到命令不必要地放入ViewModel中,只是因为人们认为这是执行ViewModel的唯一方法。 我使用的经验法则是:如果它正在做与UI相关的工作,那么它就属于视图背后的代码。 如果它正在做数据相关的工作,那么它可以进入ViewModel。 如果它正在做一个混合,然后考虑分解View和ViewModel的功能。

命令应该知道和/或操纵哪些组件?

只有它需要知道的那些。 从ViewModel访问模型等组件应该通过正确定义的属性或返回接口的函数来完成,这是为了避免紧密耦合。

是否应该调用模型的某些方法,然后将变化传回View Model / View?

从ViewModel访问模型的命令没有问题。 该命令可以更新ViewModel或Model上的属性,并通过数据绑定和属性通知的魔力,这些更新可以反映回用户界面。


带有静态命令的方法通常采用具有广泛应用的RoutedCommands或命令,该应用不耦合到任何特定对象的状态。 如果您使用ICommand动态实现,它们将在构造函数中传递给它们的方法传递给它们,它们通常是与该命令相关的ViewModel实例。

这些命令可以作用于ViewModel和Model,你如何做到这一点取决于你,我通常从命令的Execute调用VM上的相应方法来保持命令初始化代码的简洁。

我无法真正告诉你最好的方法是什么,或许其他人对什么时候以及为什么最好。

链接地址: http://www.djcxy.com/p/9597.html

上一篇: How and where do ICommands fit into the overall WPF MVVM pattern?

下一篇: WPF MVVM Doubts