Récemment, j'essaie de réutiliser certains éléments de l'interface utilisateur dans mon application. Quand j'ai commencé à programmer avec WPF, on m'a dit que DataTemplate est le meilleur moyen de réutiliser les éléments de l'interface utilisateur. Vous pouvez définir un modèle pour votre entité de données et l'utiliser partout. Cela semble très bien. Cependant, j'ai aussi trouvé quelques inconvénients, surtout quand on compare avec UserControl.WPF, UserControl ou DataTemplate
- Vous ne pouvez pas réutiliser un DataTemplate défini dans une autre fenêtre ou UserControl. Par exemple, si UserDataTemplate est défini dans WindowA.xaml, vous ne pouvez pas l'utiliser dans WindowB.xaml. La solution peut être de placer le DataTemplate en tant que ressource dans un dictionnaire de ressources global.
- Il est difficile d'avoir du code derrière DataTemplate. Comme mentionné à l'item 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é une astuce pour que ResourceDictionary ait un fichier cs. Mais il a encore un autre problème.
Un autre problème de DataTemplate est que vous devez être clair avec la différence entre l'instance de DataTemplate elle-même et les instances du contenu de DataTemplate. Un DataTemplate aura une seule "instance de DataTemplate" et peut avoir plusieurs instances du contenu de 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'aura un cas cependant, une instance Utilisateur2 sera créé une fois que le DataTemplate est appliqué, ce qui signifie que l'utilisateur 2 aura plusieurs instances si le datatemplate est appliqué plusieurs fois. Cependant, contrairement à UserControl, le champ "mousePos" n'aura PAS beaucoup de copies. Si le DataTemplate est appliqué 100 fois, le mousePos n'aura pas 100 copies, ce qui signifie que les 100 Grids utiliseront le seul champ mousePos en même temps, ce qui peut causer des problèmes. Dans UserControl, le champ que vous avez défini ne sera utilisé que par le contrôle. 100 instances UserControl auront 100 copies de champ. Peut-être que j'utilise DataTemplate dans le mauvais sens. Tout commentaire est apprécié.
Meilleures salutations,
Zach