【问题标题】:How and where do ICommands fit into the overall WPF MVVM pattern?ICommands 如何以及在哪里适合整个 WPF MVVM 模式?
【发布时间】:2012-03-01 00:02:37
【问题描述】:

我正在尝试学习如何使用 WPF 命令,以及它们如何适应 MVVM 模式。我了解某些控件(例如按钮或菜单)具有 Command 属性,当设置为 ICommand 类的实例时,该属性会将按钮连接到该命令。设置好后,按钮将通过命令的 CanExecuteChanged 事件禁用和启用,单击控件将调用命令的 Execute 方法。

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

另外,命令如何与视图、视图模型或模型相关联?命令应该注意和/或操纵这些组件中的哪些?执行命令时应该发生什么?它是否应该调用模型的某些方法,然后将更改传回给视图模型/视图?还是命令应该通过 View Model 的方法与模型通信?

【问题讨论】:

    标签: .net wpf command routed-commands


    【解决方案1】:

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

    您为希望能够从任何地方访问的命令执行此操作。例如,如果您希望 F1 的键绑定始终显示帮助屏幕,那么您将在一个全局可访问的位置实现此命令,然后从各个屏幕绑定到它。

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

    如果命令正在处理数据,那么 ViewModel 是它的好地方。如果命令不需要对数据做任何事情,则将其放在 View 后面的代码中(因为它与 ViewModel 无关,您不需要用它污染 ViewModel)。一个有趣的情况是,当您正在执行诸如弹出对话框以响应击键之类的操作时,您需要将当前选定的网格项传递给对话框 - 命令应该放在哪里?在这种情况下,我会将它放在视图后面的代码中,因为没有令人信服的理由将它放在 ViewModel 中 - 如果需要,视图可以从 ViewModel 中检索所选项目。

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

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

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

    是否应该调用模型的某些方法,然后将更改传回给视图模型/视图?

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

    【讨论】:

      【解决方案2】:

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

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

      我无法真正告诉你最好的方法是什么,也许其他人更了解什么时候什么时候什么效果最好,为什么效果最好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2011-03-10
        • 2013-01-29
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多