Подтвердить что ты не робот

Должен ли я использовать UserControls для своих представлений вместо DataTemplates?

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

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

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

4b9b3361

Ответ 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