Должен ли я использовать UserControls для своих представлений вместо DataTemplates? - PullRequest
12 голосов
/ 26 мая 2011

Я читал этот пост , и автор высказывает предположение, что использование DataTemplates для определения ViewModel - это безумный способ сделать это (# 7).Я делаю это все время, неужели это так плохо?

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

Большинство моих представлений - это просто ResourceDictionary, который определяет DataTemplate или два.Для меня это имеет гораздо больший смысл, чем создание UserControl для каждой ViewModel.Зачем мне нужен дополнительный слой в визуальном дереве WPF, когда он не нужен?И почему я хочу позаботиться о отображении ViewModels в Views, если DataTemplate делает это для меня?Является ли этот синтаксис действительно "безумным подходом"?

Ответы [ 3 ]

7 голосов
/ 26 мая 2011

Ничего плохого в этом нет, за исключением невероятно больших файлов xaml и отсутствия поддержки редактирования, которую DataTemplates имеют на поверхности разработки.

Если эти проблемы причиняют вам боль, вы всегда можете ...

<DataTemplate DataType="{x:Type local:MyViewModel}">
    <local:MyViewModelUserControl />
</DataTemplate>
1 голос
/ 26 мая 2011

Хорошо с DataTemplate является то, что они строго типизированы для классов Viewmodel. Все, что вам нужно сделать, это создать ContentPresenter в View и привязать DataContext к виртуальной машине. Если ваш DataTemplate определен в ResourceDictionary и имеет атрибут DataType вместо Key, WPF внутренне выяснит правильный DataTemplate для класса VM и отобразит его.

Но, как вы упомянули, мы не можем создать шаблон данных в отдельном файле. Таким образом, файл, в котором существуют DataTemplates в ResourceDictionary (например, App.xaml), файл становится действительно грязным, и вскоре становится трудно управлять кодом.

Итак, я считаю, что если виртуальная машина проста, создайте шаблон данных. Или же всегда лучше создать отдельный UserControl и связать его содержимое с виртуальной машиной.

0 голосов
/ 27 июля 2016

Я столкнулся с проблемой производительности.Существует разница между следующими двумя случаями:

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 раза.Я разместил это как отдельный вопрос

...