关于Josh Smith的示例应用程序的MVVM问题

时间:2009-11-22 18:11:06

标签: c# wpf mvvm command

我一直在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx处理Josh Smith关于MVVM的文章。每个部分对我来说都很有意义,但我很难将它们作为一个连贯的单位在心理上融合在一起。我有两个问题可以帮助你。

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

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

  3. 我也想知道我是否应该把它分成两个问题?

3 个答案:

答案 0 :(得分:3)

  1. 我同意Yacoder的观点。从你所知道的或你的愿景开始。如果您的愿景是获得某个UX,请从Expression Blend开始,如果您愿意的话。如果您知道自己需要什么功能,请从ViewModels和Unit测试开始。

  2. Smith的应用程序从App.xaml.cs开始。 在那里创建并显示MainWindowViewModel和MainWIndow。

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

    史密斯似乎喜欢检查相应私有字段是否为空的属性,如果是,则分配它们。因此,“Commands”集合在MainWindowViewModel的第51行创建,它在那里调用CreateCommands()。

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

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

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

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

    这大致是两个视图可以使用相同类型的按钮来为各自的客户数据做同样的事情。

答案 1 :(得分:2)

  1. 从您更了解的部分开始。用户界面或模型。无论如何,你将不得不对整个MVVM事物进行多次迭代,以使所有部件组合在一起。
  2. 你的第二个问题对我来说并不完全清楚,我会说只是因为应用程序运行而没有启动任何命令,某些操作,如按钮点击触发命令来执行其操作。此外,可以启用/禁用每个命令,然后由相应控件的可视状态反映。即使在MVVM和WPF的边界之外,它也是quite a common pattern

答案 2 :(得分:2)

Josh Smith的文章是MVVM上最好的资源。但如果你不能马上理解它,你可能会考虑阅读我的,任何人都可以轻易理解。 http://codingtales.com/2010/02/06/creating-a-complete-tabbed-interface-in-wpf-using-mvvm/