我应该为视图使用UserControl而不是DataTemplates吗?

问题描述

| 我在阅读这篇文章时,作者建议使用DataTemplates定义viewmodel是一种疯狂的方法(#7)。我一直都这样做,真的那么糟糕吗?
<DataTemplate DataType=\"{x:Type local:Myviewmodel}\">
    <Grid>
        ...
    </Grid>
</DataTemplate>
我的大多数视图只是定义一个或两个DataTemplate的ResourceDictionary。对我来说,这样做比为每个viewmodel创建一个UserControl更好。为什么不需要WPF可视树中的多余图层?以及为什么在DataTemplate为我做时要照顾将viewmodels映射到View?这种语法真的是“疯子方法”吗?     

解决方法

没什么不好,除了非常大的xaml文件和DataTemplates在设计图面上缺乏编辑支持之外。 如果这些问题在伤害您,您可以随时...
<DataTemplate DataType=\"{x:Type local:MyViewModel}\">
    <local:MyViewModelUserControl />
</DataTemplate>
    ,DataTemplate的优点在于,它们被强类型化为Viewmodel类。您需要做的就是在View中创建ContentPresenter并将DataContext绑定到VM。如果您的DataTemplate是在ResourceDictionary中定义的,并且具有DataType属性而不是Key,则WPF将在内部为VM类找出正确的DataTemplate并显示它。 但是正如您提到的,我们不能在单独的文件中创建DataTemplate。因此,ResourceDictionary中存在DataTemplates的文件(例如App.xaml)变得非常混乱,并且很难很快管理代码。 所以我的看法是,如果VM很简单,则创建一个DataTemplate。否则,最好创建一个单独的UserControl并将其内容绑定到VM。     ,我遇到了性能问题。下两种情况之间存在差异: 1。
<DataTemplate DataType=\"{x:Type local:MyViewModel}\">
    <!-- xaml is moved to separate user control -->
    <local:MyViewModelUserControl />
</DataTemplate>
2。
<DataTemplate DataType=\"{x:Type local:MyViewModel}\">
    <!-- xaml is typed here directly -->
    <Border>
         ...
    </Border>
</DataTemplate>
在第一种情况下,呈现结果所需的时间比第二种情况下更长。而这个差异大约是2倍。 我将其作为单独的问题发布