我应该将UserControl用于我的视图而不是DataTemplates吗?

时间:2011-05-26 11:50:51

标签: wpf mvvm user-controls view datatemplate

我正在阅读this post并且作者提出使用DataTemplates定义ViewModel的建议是疯子的做法(#7)。我一直这样做,真的那么糟糕吗?

<DataTemplate DataType="{x:Type local:MyViewModel}">
    <Grid>
        ...
    </Grid>
</DataTemplate>

我的大多数视图都只是一个ResourceDictionary,它定义了一个或两个DataTemplate。对我而言,这比为每个ViewModel创建UserControl更有意义。为什么我不想在WPF的可视化树中使用额外的图层?当DataTemplate为我做这件事时,为什么我要照顾将ViewModels映射到Views?这种语法真的是“疯子式”吗?

3 个答案:

答案 0 :(得分:7)

没什么不好的,除了非常大的xaml文件以及DataTemplates在设计界面上缺少编辑支持。

如果这些问题伤害了你,你可以随时......

<DataTemplate DataType="{x:Type local:MyViewModel}">
    <local:MyViewModelUserControl />
</DataTemplate>

答案 1 :(得分:1)

DataTemplate的优点在于它们是Viewmodel类的强类型。您需要做的就是在View中创建一个ContentPresenter并将DataContext绑定到VM。如果您的DataTemplate在ResourceDictionary中定义并且具有DataType属性而不是Key,则WPF将在内部为VM类找出正确的DataTemplate并显示它。

但正如您所提到的,我们无法在单独的文件中创建DataTemplate。因此,ResourceDictionary中存在DataTemplates的文件(例如App.xaml),文件变得非常混乱,很快就很难管理代码。

所以我的看法是,如果VM很简单,那就创建一个DataTemplate。否则,最好创建一个单独的UserControl并将其内容绑定到VM。

答案 2 :(得分:0)

我遇到了性能问题。接下来的两种情况有区别:

1

MemberAuthenticator

2

<DataTemplate DataType="{x:Type local:MyViewModel}">
    <!-- xaml is moved to separate user control -->
    <local:MyViewModelUserControl />
</DataTemplate>

在第一种情况下,渲染结果所需的时间比第二种情况要长。而这个差异大约是2倍。 我将其作为单独的question

发布