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

WPF, UserControl или DataTemplate

Недавно я пытаюсь повторно использовать некоторые элементы пользовательского интерфейса в своем приложении. Когда я начал программировать с помощью WPF, мне сказали, что DataTemplate - лучший способ повторного использования элементов интерфейса. Вы можете определить шаблон для своего объекта данных и использовать его повсюду. Звучит очень хорошо. Однако я также обнаружил некоторые недостатки, особенно когда их сравнивают с UserControl.

  • Вы не можете повторно использовать DataTemplate, определенные в другом окне или UserControl. Например, если UserDataTemplate определяется в WindowA.xaml, вы не можете использовать его в WindowB.xaml. Возможно, это решение помещает DataTemplate в качестве ресурса в глобальный словарь ресурсов.
  • DataTemplate трудно содержать какой-то код. Как упоминалось в пункте 1, если вы поместили DataTemplate в ResourceDictionary, поместить код по умолчанию нецелесообразно. Я googled проблема, и да, я нашел трюк, чтобы заставить ResourceDictionary иметь файл cs. Но у него все еще есть другая проблема.
  • Другая проблема DataTemplate заключается в том, что вы должны четко понимать разницу между экземпляром самой DataTemplate и экземплярами содержимого DataTemplate. DataTemplate будет иметь только один "экземпляр DataTemplate" и может иметь много экземпляров содержимого DataTemplate. Позвольте мне объяснить это с помощью примера:

    <DataTemplate>
            <DataTemplate.Resources>
                    <my:User x:key="User1"/>
            </DataTemplate.Resources>                
            <Grid MouseLeftButtonDown="OnMouseLeftButtonDown">
                    <Grid.Resources>
                            <my:User x:key="User2"/>
                    </Grid.Resources>
            </Grid>        
    </DataTemplate>
    
    
    public partial class CodeBehind
    {
             Point mousePos = new Point();
    
            private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)  
            {
                    mousePos = e.Pos...;
            }
    }
    

Результат будет таким, что: User1 будет иметь только один экземпляр, однако экземпляр User2 будет создан после применения DataTemplate, что означает, что User2 будет иметь много экземпляров, если набор данных применяется много раз. Однако, в отличие от UserControl, поле "mousePos" НЕ будет иметь много копий. Если DataTemplate применяется 100 раз, mousePos не будет иметь 100 копий, что означает, что 100 Grids будут использовать только одно поле mousePos в одно и то же время, что может вызвать проблемы. В UserControl поле, которое вы определили, будет использоваться только элементом управления. 100 экземпляров UserControl будут иметь 100 копий полей.

Возможно, я использую DataTemplate неправильно. Любые комментарии приветствуются.

С уважением,

Зак

4b9b3361

Ответ 1

Концептуально DataTemplates и UserControls решают две разные проблемы. Они не являются взаимозаменяемыми, поэтому ваши сравнения не очень точны.

DataTemplates - это применение визуального стиля к типу DataType. Обычно это означает, что у меня есть собственный класс .NET под названием Foo, и я хочу дать ему визуальный стиль. Я сделал бы это, создав DataTemplate с DataType для Foo.

Затем я могу разместить этот DataTemplate в своем приложении (например, в App.XAML), и у меня будет мой визуальный стиль, применяемый к моему объекту данных Foo, где бы он ни использовался. Часто это означает, что вы увидите ContentControl, у которого свойство Content привязано к свойству типа Foo.

UserControls с другой - все об организации XAML. Пользовательский элемент управления помогает организовать фрагменты XAML, которые вы хотите повторно использовать во всем приложении, которое имеет поведение и функциональность, связанные с ним. Это больше, чем DataTempate.

DataTemplate привязан к одному типу DataType и отображает визуальный для этого типа. Пользователь UserControl может состоять из нескольких DataTypes и может включать в себя пользовательские поведения.

Говоря об этом, я очень редко нахожу потребность в UserControl. Я использую DataTemplates для моделирования моих данных и реализации своих действий, хотя привязки данных и шаблон MVVM.

Ответ 2

Лично я создаю UserControl, а затем создаю DataTemplate. Для меня это имеет следующие преимущества:

  • Может использоваться через окна, только путем переопределения части DataTemplate.
  • Может использовать код (я знаю, я знаю, но некоторые вещи намного проще с использованием кода, я не вижу смысла в ненужном усложнении моего кода на основе догмы).
  • Поддержка дизайнера XAML.

Ответ 3

Около 2.

Я бы сказал, что DataTemplates не предназначены для использования с кодом. В большинстве случаев вы можете использовать DataBinding и Commands для подключения логики между вашей моделью и ее представлением. Отсутствие кода также облегчает модульные тесты вашего приложения.