我一直在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx浏览Josh Smith关于MVVM的文章。每个部分对我来说都是有意义的,但我很难将其作为一个连贯的单元在精神上进行整合。我有2个问题会帮助很多人。
我也想知道是否应该将此分为两个问题?
最佳答案
在那里创建并显示了MainWindowViewModel和MainWIndow。
MainWindow.xaml是接下来发生的事情。它定义了UI的主要部分。其主要部分显示了两个集合。命令和工作区。这些是MainWindowViewModel的成员。
Smith似乎喜欢属性来检查其对应的私有(private)字段是否为null,如果是,则将其分配。因此,在MainWindowViewModel的第51行中创建了“Commands”集合,该集合在该窗口的南部调用CreateCommands()。
命令类由RelayCommand抽象化,可能是因为在“显示全部”或“创建”的情况下,每个命令不需要了解太多。这两个命令的方法在MainWindowViewModel中,因为它们在概念上是主窗口的功能。
Commands集合在主窗口中以列表的形式显示,因此它们需要某种可呈现的,用户友好的文本来描述它们。因此,它们被包装在自己的CommandViewModels中。
从MainWindow.xaml的第41行开始,通过XAML的魔力来显示命令。 HeaderedContentControl数据绑定(bind)到Commands集合,并指定MainWindowResources.xaml的CommandsTemplate(从该文件的第93行开始)。该模板使用HyperLink,其Command属性绑定(bind)到CommandViewModel的Command属性。
当涉及到新客户表单上的“保存”按钮时。它从CustomerView.xaml的第117行绑定(bind)到第196行的CustomerViewModel SaveCommand属性。它是一个RelayCommand,指向CustomerViewModel中的方法。每个客户 View 都有其自己的CustomerViewModel实例,该客户的数据将流向该实例。 RelayCommand的实例属于那些CustomerViewModels,因此每个 View 也具有自己的SaveCommand。 RelayCommand实例的操作和谓词不仅知道它们指向哪些方法和属性,还知道哪个实例。 CustomerViewModel的Save方法仅使用该实例中的数据。
这大致就是两个 View 可以具有相同类型的按钮,这些按钮对各自的客户数据执行相同的操作。