在MVVM中,DataTemplates被视为视图吗,就像UserControls被视为视图一样?

7
在MVVM中,每个视图都有一个视图模型。我理解视图是指可以连接到视图模型的窗口(Window),页面(Page)或用户控件(UserControl),从中获取数据。
但是,DataTemplate也可以呈现视图模型的数据。
因此,我认为DataTemplate是另一种“视图”,但似乎存在差异,例如Windows、Pages和UserControls可以定义自己的.dll文件,其中一种类型通过DataContect绑定,而另一种类型则通过附加模板进行绑定,以便Windows、Pages、UserControls可以通过ServiceLocator/Container动态连接到视图模型。

除了这四种之外,DataTemplates在渲染视图模型数据方面与Windows/Pages/UserControls有哪些不同?还有其他什么类型的“视图”吗?

3个回答

7

在我使用的方式中,DataTemplate 实际上是将 View 与 ViewModel 相链接的方法。通常,我的 MVVM 中的 DataTemplates 看起来像这样:

<DataTemplate DataType="{x:Type vm:FooViewModel}">
    <v:FooView />
</DataTemplate>

有趣,但是你的XAML的其余部分是什么样子?我尝试了一个小例子,编译后Visual Studio说需要管理员权限(Vista),很奇怪。想看看你在项目中如何使用这种模式。 - Edward Tanguay
基本上,我将“映射”数据模板放在App.xaml或主窗口的XAML中,其他所有内容都是用户控件... - Thomas Levesque
你是否正在使用ContentControl来拉取ViewModel,然后像这样尝试:<ContentControl Content="{Binding CurrentPageViewModel}"/>,并使用与您的数据模板类似的方式进行处理,如此"<DataTemplate DataType="{x:Type vm:PageModelsViewModel}"><v:PageModelsView /></DataTemplate>",但它们没有链接起来,什么也没有显示。 - Edward Tanguay
@Thomas,非常感谢您的帮助,它帮助我构建了我想要的MVVM菜单模式,但是这导致了另一个问题,也许您也解决了这个问题:https://dev59.com/OnNA5IYBdhLWcg3wSrqa - Edward Tanguay
是的,我通常使用ContentControl来显示ViewModel。为了使用DataTemplate,它必须从ContentControl的XAML上下文中访问。 - Thomas Levesque
经过大量阅读、苦难和一些洞察,这是实现纯WPF(无框架)ViewModel-First MVVM 的最简单、最强大的方法。 - heltonbiker

1
在我转换到MVVM的过程中,最让我感觉有意义的是:
用户控件:将视图和控件组合在一起,这些视图和控件旨在为用户执行整个过程。我使用用户控件来创建一个抽屉式导航菜单,使用户能够浏览不同分类的零部件(其中每个主要零部件类别都通过自己的选择过程/向导引导用户)。还需要查看图表控件。
视图:基本上是一个网格,用于分组相关数据和控件,以在最小级别上填充所需数据,以便可以重复使用。
数据模板:将“项”(例如列表框或GridView中的项)的事实组合在一起。我认为这只是描述试图获取有关列表中对象信息的文本的方式。因此,控件模板将包装数据模板块,以控制该数据模板包装项集合的显示行为。
这就是我的理解,但边界非常模糊。我喜欢Andrew Troelson的Apress书籍《Pro Expression Blend 4》。尽管他没有给出任何数据密集型示例。

0
我不建议使用DataTemplate将视图绑定到视图模型。 目前我正在使用这种方法时遇到性能问题,因为每次视图获得焦点时都会刷新视图。 正如您可以在此处此处看到的那样。
不幸的是,我还没有找到更好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接