WPF, UserControl ou DataTemplate
Récemment j'essaie de réutiliser certains éléments de l'INTERFACE de mon application. Quand j'ai commencé la programmation avec WPF, je me suis dit que DataTemplate est la meilleure façon de réutiliser les éléments de l'INTERFACE utilisateur. Vous pouvez définir un modèle de données d'entité et de l'utiliser partout. Il semble très bon.
Cependant, j'ai trouvé aussi quelques inconvénients, surtout quand il est comparé avec d'UserControl.
- Vous ne pouvez pas réutiliser un DataTemplate défini dans une nouvelle Fenêtre ou un UserControl. Par exemple, si UserDataTemplate est de définir dans Fenetrea.xaml, vous ne pouvez pas l'utiliser dans WindowB.xaml. La solution pourrait être que mettre le DataTemplate comme une ressource dans une Ressource globale Dictionnaire.
- DataTemplate est difficile d'avoir un peu de code derrière. Comme mentionné au point 1, si vous mettez le DataTemplate dans un ResourceDictionary, il n'y a pas de place pour mettre votre code par défaut. J'ai googlé le problème, et oui, j'ai trouvé un truc pour faire de la ResourceDictionary ont une cs de fichier. Mais il a encore un autre problème.
-
Un autre problème de DataTemplate est que vous devez être clair sur la différence entre l'instance de DataTemplate lui-même et les instances du contenu de DataTemplate. Un DataTemplate aura seulement une "instance de DataTemplate", et peut avoir plusieurs instances du contenu de la DataTemplate. Laissez-moi vous expliquer avec un Exemple:
<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...; } }
Le résultat sera que : User1 n'ont qu'un seul exemple, cependant, un User2 instance sera créé une fois que le DataTemplate est appliqué, ce qui signifie User2 aura beaucoup de cas si le datatemplate est appliqué à plusieurs reprises.
Cependant, à la différence de UserControl, le champ "mousePos" n'auront PAS beaucoup d'exemplaires. Si le DataTemplate est appliquée de 100 fois, la mousePos n'aurez pas à 100 exemplaires, ce qui signifie les 100 Grilles utiliser le seul mousePos champ en même temps, ce qui peut causer des problèmes.
Dans UserControl, le terrain vous avez défini pour être utilisé uniquement par le contrôle. 100 UserControl des instances de 100 champ copies.
Peut-être que je suis en utilisant le DataTemplate dans le mauvais sens. Tout commentaire est apprécié.
Cordialement,
Zach
Vous devez vous connecter pour publier un commentaire.
Conceptuellement DataTemplates et UserControls résoudre deux problèmes différents. Ils ne sont pas vraiment interchangeables de sorte que vos comparaisons ne sont pas vraiment précis.
DataTemplates sont tout au sujet de l'application d'un style visuel à un Type de données. Généralement ce que cela signifie, c'est que j'ai mes propres .NET de la classe Foo et je veux lui donner un style visuel. Je voudrais faire cela par la création d'un DataTemplate, avec un Type de données de Foo.
Je peux alors placer ce DataTemplate dans mon application (par exemple en Application.XAML) et je vais avoir mon style visuel appliqué à mon objet de données Foo partout où il est utilisé. Souvent, cela signifie que vous verrez un ContentControl qui a une propriété de Contenu lié à une propriété de type Foo.
UserControls sur les autres avions sont tous à propos de l'organisation de XAML. Un contrôle de l'utilisateur aide dans l'organisation de morceaux de XAML que vous voulez ré-utiliser dans votre application qui a des comportements et une fonctionnalité liée à elle. C'est plus que ce qu'un DataTempate fera.
Un DataTemplate est lié à un Type de données et d'afficher un visuel de ce type. Un UserControl peut être composé de plusieurs Types de données et peuvent inclure des comportements personnalisés.
Cela étant dit, j'ai très rarement besoin de trouver un UserControl. J'utilise tous les DataTemplates sur le modèle de mes données et de mettre en œuvre mes comportements bien que les liaisons de données et le modèle MVVM.
Personnellement, j'ai créer un UserControl et ensuite faire un DataTemplate de que. Cela a pour avantages pour moi:
Sur 2.
Je dirais que les DataTemplates ne sont pas conçus pour être utilisés avec le code-behind. Vous pouvez la plupart des cas, seule l'utilisation de la liaison de données et de Commandes au fil de la logique entre votre modèle et sa représentation. Ne pas avoir de code-behind également de faciliter les tests unitaires de l'application.