更新
本着 StackOverflow 的 wiki 精神,这里有一个更新:
我在下面添加了 Joe White 的 IValueConverter 建议。它就像一个魅力。
我已经编写了一个“快速入门”示例,它使用一些廉价的字符串替换来自动映射 ViewModels->Views。如果没有找到代表 ViewModel 的 View,则默认为“正在建设中”页面。我将这种方法称为“WPF MVVM White”,因为这是 Joe White 的想法。这是几个屏幕截图。
第一张图片是“[SomeControlName]ViewModel”的案例,基于纯命名约定,有一个对应的“[SomeControlName]View” 。第二种情况是 ModelView 没有任何视图来表示它。不再有长 ViewModel 到 View 映射的 ResourceDictionaries。现在是纯粹的命名约定。
我在这里发布了该项目的下载: Mvvm.White.Quickstart.zip
原帖
我在周末阅读了 Josh Smith关于 WPF MVVM的精彩 MSDN 文章。它注定会成为经典。
我花了一段时间才理解要求 WPF 呈现ViewModel的魔力。
这就像说“这是一个类,WPF。去找出使用哪个 UI 来呈现它。”
对于那些错过这个魔法的人,WPF 可以通过在 ResourceDictionary 映射中查找 ModelView 的View并拉出相应的View来做到这一点。(向下滚动到图 10 提供视图)。
我立即跳出来的第一件事是已经有一个强大的命名约定:
classNameView ("View" suffix)
classNameViewModel ("ViewModel" suffix)
我的问题是:
由于ResourceDictionary可以以编程方式进行操作,我想知道是否有人设法使用 Regex.Replace 整个东西,所以查找是自动的,并且任何新的 View/ViewModels 都通过它们的命名约定得到解决?
[编辑] 我想象的是对 ResourceDictionary 的钩子/拦截。
...还考虑在启动时使用互操作提取*View$
和*ViewModel$
类名在代码中构建 DataTemplate 字典的方法:
//build list
foreach ....
String.Format("<DataTemplate DataType=\"{x:Type vm:{0} }\"><v:{1} /></DataTemplate>", ...)