我正在阅读this post并且作者提出使用DataTemplates定义ViewModel的建议是疯子的做法(#7)。我一直这样做,真的那么糟糕吗?
<DataTemplate DataType="{x:Type local:MyViewModel}">
<Grid>
...
</Grid>
</DataTemplate>
我的大多数视图都只是一个ResourceDictionary,它定义了一个或两个DataTemplate。对我而言,这比为每个ViewModel创建UserControl更有意义。为什么我不想在WPF的可视化树中使用额外的图层?当DataTemplate为我做这件事时,为什么我要照顾将ViewModels映射到Views?这种语法真的是“疯子式”吗?
答案 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
发布