Quelle est la différence entre un ControlTemplate
et un DataTemplate
dans WPF?
Quelle est la différence entre un ControlTemplate
et un DataTemplate
dans WPF?
En règle générale, un contrôle est rendu pour lui-même et ne reflète pas les données sous-jacentes. Par exemple, un Button
ne serait pas lié à un objet métier - il est là uniquement pour qu'il puisse être cliqué. A ContentControl
ou ListBox
, cependant, apparaissent généralement afin de pouvoir présenter des données pour l'utilisateur.
A DataTemplate
, par conséquent, est utilisé pour fournir une structure visuelle pour les données sous-jacentes, tandis que ControlTemplate
a n'a rien à voir avec les données sous-jacentes et fournit simplement une disposition visuelle pour le contrôle lui-même.
Un ControlTemplate
ne contiendra généralement que des TemplateBinding
expressions, se liant aux propriétés du contrôle lui-même, tandis qu'un DataTemplate
contiendra des expressions de liaison standard, se liant aux propriétés de son DataContext
(objet métier / domaine ou modèle de vue).
Fondamentalement, un
ControlTemplate
décrit comment afficher un contrôle tandis qu'unDataTemplate
décrit comment afficher des données.Par exemple:
A
Label
est un contrôle et comprendra unControlTemplate
qui indique que leLabel
doit être affiché à l'aide d'unBorder
autour de certains contenus (unDataTemplate
ou un autre contrôle).Une
Customer
classe est Data et sera affichée en utilisant unDataTemplate
qui pourrait dire d'afficher leCustomer
type commeStackPanel
contenant deux l'TextBlocks
un indiquant le nom et l'autre affichant le numéro de téléphone. Il peut être utile de noter que toutes les classes sont affichées en utilisantDataTemplates
, vous utiliserez généralement le modèle par défaut qui est unTextBlock
avec laText
propriété définie sur le résultat de laToString
méthode de l'objet .la source
Troels Larsen a une bonne explication sur le forum MSDN
la source
ControlTemplate
: Représente le style de contrôle.DataTemplate
: Représente le style de données (comment souhaitez-vous afficher vos données).Tous les contrôles utilisent un modèle de contrôle par défaut que vous pouvez remplacer via la propriété du modèle.
Par exemple, le
Button
modèle est un modèle de contrôle.Button
le modèle de contenu est un modèle de donnéesla source
ControlTemplate
- Changer l'apparence de l'élément. Par exemple,Button
peut contenir une image et du texteDataTemplate
- Représenter les données sous-jacentes à l'aide des éléments.la source
ControlTemplate
DÉFINIT l'apparence visuelle,DataTemplate
REMPLACE l'apparence visuelle d'un élément de données.Exemple: je veux montrer un bouton de forme rectangulaire à circulaire => Modèle de contrôle.
Et si vous avez des objets complexes à contrôler, il appelle et affiche simplement
ToString()
, avecDataTemplate
vous pouvez obtenir différents membres et afficher et modifier leurs valeurs de l'objet de données.la source
Toutes les réponses ci-dessus sont excellentes mais il y a une différence clé qui a été manquée. Cela aide à prendre de meilleures décisions sur le moment d'utiliser quoi. C'est la
ItemTemplate
propriété:DataTemplate est utilisé pour les éléments qui fournissent la propriété ItemTemplate pour vous permettre de remplacer le contenu de ses éléments à l'aide de
DataTemplate
s que vous définissez précédemment en fonction des données liées via un sélecteur que vous fournissez.Mais si votre contrôle ne vous offre pas ce luxe, vous pouvez toujours utiliser un
ContentView
qui peut afficher son contenu à partir de prédéfinisControlTemplate
. Fait intéressant, vous pouvez modifier laControlTemplate
propriété de votreContentView
au moment de l'exécution. Une dernière chose à noter que contrairement aux contrôles avecItemTemplate
propriété, vous ne pouvez pas avoir deTemplateSelector
contrôle pour ce contenu (ContentView). Cependant, vous pouvez toujours créer des déclencheurs pour modifier leControlTemplate
au moment de l'exécution.la source