2009-11-27 10 views
20

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

  1. Вы не можете повторно использовать DataTemplate, определенную в другом окне или UserControl. Например, если UserDataTemplate определяется в WindowA.xaml, вы не можете использовать его в WindowB.xaml. Возможно, это решение помещает DataTemplate в качестве ресурса в глобальный словарь ресурсов.
  2. DataTemplate трудно содержать код. Как упоминалось в пункте 1, если вы поместили DataTemplate в ResourceDictionary, поместить код по умолчанию нецелесообразно. Я googled проблема, и да, я нашел трюк, чтобы заставить ResourceDictionary иметь файл cs. Но у него все еще есть другая проблема.
  3. Другая проблема 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 будет иметь только один экземпляр, однако, экземпляр Пользователь2 будет создан после того, как DataTemplate применяется, что означает Пользователь2 будет многие случаи, если набор данных применяется много раз. Однако, в отличие от UserControl, поле «mousePos» НЕ будет иметь много копий. Если DataTemplate применяется 100 раз, mousePos не будет иметь 100 копий, что означает, что 100 Grids будут использовать только одно поле mousePos в одно и то же время, что может вызвать проблемы. В UserControl поле, которое вы определили, будет использоваться только элементом управления. 100 экземпляров UserControl будут иметь 100 копий полей.

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

С наилучшими пожеланиями,

Zach

ответ

25

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

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

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

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

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

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

2

О 2.

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

10

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

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