В чем разница между a ControlTemplate
и a DataTemplate
в WPF?
В чем разница между a ControlTemplate
и a DataTemplate
в WPF?
Обычно элемент управления создается сам по себе и не отражает базовые данные. Например, Button
бизнес-объект не будет привязан - он существует только для того, чтобы на него можно было нажать. А ContentControl
или ListBox
, как правило, появляются так, что они могут представлять данные для пользователя.
A DataTemplate
, следовательно, используется для предоставления визуальной структуры для базовых данных, в то время как a не ControlTemplate
имеет ничего общего с базовыми данными и просто предоставляет визуальную компоновку для самого элемента управления.
A ControlTemplate
обычно будет содержать только выражения, привязывающие к свойствам самого элемента TemplateBinding
управления, тогда как a DataTemplate
будет содержать стандартные выражения Binding, привязывающие к свойствам его DataContext
(объект бизнес / домен или модель представления).
Очень в основном
ControlTemplate
описывает, как отображать элемент управления, аDataTemplate
описывает, как отображать данные.Например:
A
Label
является элементом управления и будет включать в себя элемент,ControlTemplate
который говорит, чтоLabel
должен отображаться с использованиемBorder
некоторого содержимого (aDataTemplate
или другого элемента управления).Customer
Класс данные и будет отображаться с помощьюDataTemplate
которого можно было сказать , чтобы отобразитьCustomer
тип в качествеStackPanel
содержащих дваTextBlocks
один , показывающего имени , а другие отображаются номер телефона. Может быть полезно отметить, что все классы отображаются с использованиемDataTemplates
, вы просто будете использовать шаблон по умолчанию, которыйTextBlock
соText
свойством, установленным в результате метода объектаToString
.источник
У Troels Larsen есть хорошее объяснение на форуме MSDN
источник
ControlTemplate
: Представляет стиль управления.DataTemplate
: Представляет стиль данных (как бы вы хотели показать свои данные).Все элементы управления используют шаблон элемента управления по умолчанию, который можно переопределить через свойство шаблона.
Например,
Button
шаблон является шаблоном управления.Button
Шаблон содержимого является шаблоном данных.источник
ControlTemplate
- Изменение внешнего вида элемента. Например,Button
может содержать изображение и текстDataTemplate
- Представление базовых данных с использованием элементов.источник
ControlTemplate
Определяет внешний вид,DataTemplate
заменяет внешний вид элемента данных.Пример: я хочу показать кнопку от прямоугольной формы до формы круга => Шаблон управления.
И если у вас есть сложные объекты для элемента управления, он просто вызывает и показывает
ToString()
, с помощью которогоDataTemplate
вы можете получить различные члены и отобразить и изменить их значения объекта данных.источник
Все вышеприведенные ответы великолепны, но есть ключевое различие, которое было упущено. Это помогает принимать лучшие решения о том, когда что использовать. Это
ItemTemplate
свойство:DataTemplate используется для элементов, которые предоставляют свойство ItemTemplate для замены содержимого его элементов, используя те, которые
DataTemplate
вы определили ранее в соответствии с привязанными данными через предоставленный вами селектор.Но если ваш контроль не предоставляет такую роскошь для вас, вы все равно можете использовать тот,
ContentView
который может отображать его содержимое из предопределенныхControlTemplate
. Интересно, что вы можете изменитьControlTemplate
свойство вашегоContentView
во время выполнения. Еще одна вещь, на которую следует обратить внимание: в отличие от элементов управления соItemTemplate
свойством, у вас не может быть элемента управленияTemplateSelector
для этого (ContentView). Тем не менее, вы все еще можете создавать триггеры для измененияControlTemplate
во время выполнения.источник