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.

  1. 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.
  2. 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.
  3. 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

InformationsquelleAutor Zach | 2009-11-27