Должен ли я использовать UserControls для своих представлений вместо DataTemplates?
Я читал этот пост, и автор делает предположение, что использование DataTemplates для определения ViewModel - это безумный способ сделать это (# 7). Я все время это делаю, неужели это так плохо?
<DataTemplate DataType="{x:Type local:MyViewModel}">
<Grid>
...
</Grid>
</DataTemplate>
Большинство моих представлений - это просто ResourceDictionary, который определяет DataTemplate или два. Для меня это имеет смысл, чем создание UserControl для каждого ViewModel. Зачем мне нужен дополнительный слой в визуальном дереве WPF, когда он не нужен? И почему я хочу позаботиться о том, чтобы сопоставлять ViewModels с представлениями, когда DataTemplate делает это для меня? Является ли этот синтаксис действительно "лунатическим подходом"?
Ответы
Ответ 1
Ничего плохого в этом нет, кроме невероятно больших файлов xaml и отсутствия поддержки редактирования, которые DataTemplates имеют на поверхности дизайна.
Если эти проблемы причиняют вам боль, вы всегда можете...
<DataTemplate DataType="{x:Type local:MyViewModel}">
<local:MyViewModelUserControl />
</DataTemplate>
Ответ 2
Хорошая вещь с DataTemplate заключается в том, что они строго типизированы для классов Viewmodel. Все, что вам нужно сделать, это создать ContentPresenter в представлении и привязать DataContext к VM. Если ваш DataTemplate определен в ResourceDictionary и имеет атрибут DataType вместо Key, WPF будет внутренне определять правильный DataTemplate для класса VM и отображать его.
Но, как вы упомянули, мы не можем создать DataTemplate в отдельном файле. Таким образом, файл, в котором существуют DataTemplates в ResourceDictionary (например, App.xaml), файл становится очень грязным, и скоро становится сложно управлять кодом.
Итак, я считаю, что если виртуальная машина проста, создайте DataTemplate. Или же всегда лучше создать отдельный UserControl и связать его содержимое с виртуальной машиной.
Ответ 3
Я столкнулся с проблемой производительности. Существует разница между следующими двумя случаями:
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 раза.
Я разместил его как отдельный question