【问题标题】:MVVM questions on Josh Smith's Sample Application关于 Josh Smith 的示例应用程序的 MVVM 问题
【发布时间】:2010-12-19 06:21:19
【问题描述】:

我一直在阅读 Josh Smith 在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx 上关于 MVVM 的文章。每个部分对我来说都很有意义,但我很难在精神上将它们作为一个连贯的单元放在一起。我有 2 个问题会很有帮助。

  1. 如果我要构建示例 ap,构建它的逻辑顺序是什么?

  2. 对于命令结构,ap运行时会发生什么,以什么顺序运行?

我也想知道我是否应该将这个问题分成 2 个问题?

【问题讨论】:

  • 你能澄清一下关于命令的问题吗?这是一个好奇的问题,还是你有问题?
  • 我想我正在寻找的是执行程序以设置命令时会发生什么,实例化视图以注册其命令时会发生什么以及单击按钮时会发生什么执行正确的命令。我认为给我带来问题的部分与命令系统如何知道单击按钮时要执行什么有关。如果 2 个窗口有一个保存命令,它如何知道要执行哪个?

标签: c# wpf mvvm command


【解决方案1】:
  1. 我同意 Yacoder 的观点。从你所知道的或你的愿景开始。如果您的愿景是获得某种 UX,如果您愿意,可以从 Expression Blend 开始。如果您知道自己想要什么功能,请从 ViewModel 和单元测试开始。

  2. Smith 的应用程序以 App.xaml.cs 开头。 在那里创建并显示了 MainWindowViewModel 和 MainWIdow。

MainWindow.xaml 是接下来发生的事情。它定义了 UI 的主要部分。主要部分是展示两个系列;命令和工作区。这些是 MainWindowViewModel 的成员。

Smith 似乎喜欢使用属性来检查其对应的私有字段是否为空,如果是,则分配它们。因此,“Commands”集合是在 MainWindowViewModel 的第 51 行创建的,该集合在其南边调用 CreateCommands()。

命令类被 RelayCommand 抽象出来,可能是因为在“显示全部”或“创建”的情况下,每个命令不需要知道太多。这两个命令的方法在 MainWindowViewModel 中,因为它们在概念上是主窗口的函数。

Commands 集合在主窗口中被可视化为一个列表,因此它们需要某种可呈现的、用户友好的文本来描述它们。因此,它们被包装在自己的 CommandViewModel 中。

这些命令通过 XAML 的魔力从 MainWindow.xaml 的第 41 行开始呈现。 HeaderedContentControl 数据绑定到 Commands 集合,并指定 MainWindowResources.xaml 的 CommandsTemplate(从该文件的第 93 行开始)。该模板使用 HyperLink,其 Command 属性绑定到 CommandViewModel 的 Command 属性。

当谈到新客户表单上的“保存”按钮时。这从 CustomerView.xaml 第 117 行绑定到第 196 行的 CustomerViewModel SaveCommand 属性。它是一个 RelayCommand,指向 CustomerViewModel 中的方法。每个客户视图都有自己的 CustomerViewModel 实例,该客户的数据存放在其中。 RelayCommand 的实例属于那些 CustomerViewModels,所以每个视图也有它自己的 SaveCommand。 RelayCommand 实例的动作和谓词不仅知道它们指向哪些方法和属性,还知道哪个实例。 CustomerViewModel 的 Save 方法仅使用来自该实例的数据。

这大致就是两个视图可以使用相同类型的按钮来对各自的客户数据执行相同操作的方式。

【讨论】:

  • 我现在看到命令给我带来麻烦的地方,我在想只有一个中继命令实例,这就是我遇到麻烦的地方,我有太多年的“线性”编程旧的思维模式对我来说很难死。
  • 感谢您的接受。 WPF 对我来说也很难,它打破了 20 年的 UI 编码。向其他人解释它有助于我把它直接放在脑海中,感谢给我机会。
【解决方案2】:
  1. 从您更了解的部分开始。 UI 或模型就是这样。无论如何,您必须对整个 MVVM 进行多次迭代,以使所有部分组合在一起。
  2. 你的第二个问题对我来说不是很清楚,我想说没有命令只是因为应用程序运行而启动,一些动作,比如按钮点击触发命令执行它的动作。此外,每个命令都可以启用/禁用,然后通过相应控件的视觉状态反映出来。它是quite a common pattern,甚至超出了 MVVM 和 WPF 的边界。

【讨论】:

  • 我希望有办法做出 2 个正确的答案,感谢您的帮助,我想我以后会把这样的问题分成 2 个。
【解决方案3】:

Josh Smith 的文章是关于 MVVM 的最佳资源。但是,如果您无法立即理解它,您可以考虑阅读任何人都可以轻松理解的我的。 http://codingtales.com/2010/02/06/creating-a-complete-tabbed-interface-in-wpf-using-mvvm/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多