2012-03-01 63 views
3

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

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

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

回答

1

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

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

我真的不能告诉你什么是最好的方法,也许别人有更多的洞察什么时候以及为什么最好。

1

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

您为您希望能够命令做到这一点的静态属性。从任何地方访问。例如,如果你想要一个F1的键排序总是显示帮助屏幕,那么你可以在一个全局可访问的点上执行该命令,然后从各个屏幕绑定到该键。

将所看到的命令设置为ViewModel的属性,以及其他视图/窗口本身。

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

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

这些组件中的哪些应该知道和/或操作该命令?

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

它是否应该调用Model的某个方法,然后将更改传回View Model/View?

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

相关问题