2009-11-27 18 views
20

Recentemente sto cercando di riutilizzare alcuni elementi dell'interfaccia utente nella mia applicazione. Quando ho iniziato a programmare con WPF mi è stato detto che DataTemplate è il modo migliore per riutilizzare gli elementi dell'interfaccia utente. È possibile definire un modello per l'entità dati e utilizzarlo ovunque. Suona molto bene. Tuttavia, ho trovato anche alcuni svantaggi, specialmente quando viene confrontato con UserControl.WPF, UserControl o DataTemplate

  1. Non è possibile riutilizzare un DataTemplate definito in un'altra finestra o UserControl. Ad esempio, se UserDataTemplate è definito in WindowA.xaml, non è possibile utilizzarlo in WindowB.xaml. La soluzione potrebbe essere quella di inserire DataTemplate come risorsa in un dizionario di risorse globale.
  2. DataTemplate è difficile avere qualche codice dietro. Come accennato nell'articolo 1, se si inserisce il DataTemplate in un ResourceDictionary, non è possibile inserire il codice per impostazione predefinita. Ho cercato su Google il problema e sì, ho trovato un trucco per rendere ResourceDictionary un file cs. Ma ha ancora un altro problema.
  3. Un altro problema di DataTemplate è che è necessario essere chiari con la differenza tra l'istanza di DataTemplate stessa e le istanze del contenuto di DataTemplate. Un DataTemplate avrà solo una "istanza di DataTemplate" e potrebbe avere molte istanze del contenuto del DataTemplate. Mi spiego con un esempio:

    <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...; 
         } 
    } 
    

Il risultato sarà che: Utente1 avrà una sola istanza, tuttavia, un esempio Utente2 viene creato quando il DataTemplate viene applicato, il che significa Utente2 avrà molte istanze se il datatemplate viene applicato molte volte. Tuttavia, a differenza di UserControl, il campo "mousePos" NON avrà molte copie. Se il DataTemplate viene applicato 100 volte, il mousePos non avrà 100 copie, il che significa che le 100 Griglie useranno l'unico campo mousePos come la stessa ora, il che potrebbe causare problemi. In UserControl, il campo definito verrà utilizzato solo dal controllo. 100 istanze UserControl avranno 100 copie di campo.

Forse sto usando DataTemplate nel modo sbagliato. Ogni commento è apprezzato.

Con i migliori saluti,

Zach

risposta

25

Concettualmente DataTemplates e UserControls risolvono due diversi problemi. Non sono realmente intercambiabili, quindi i tuoi confronti non sono veramente accurati.

DataTemplates riguardano l'applicazione di uno stile visivo a un DataType. In genere ciò significa che ho la mia classe .NET chiamata Foo e voglio dargli uno stile visivo. Lo farei creando un DataTemplate con un DataType di Foo.

Posso quindi inserire questo DataTemplate nella mia applicazione (ad esempio in App.XAML) e avrò il mio stile visivo applicato al mio oggetto dati Foo ovunque venga utilizzato. Spesso questo significa che vedrete un ContentControl che ha una proprietà Content associata a una proprietà di tipo Foo.

I controlli utente sull'altro riguardavano l'organizzazione di XAML. Un controllo utente aiuta nell'organizzazione di blocchi di XAML che si desidera riutilizzare in tutta l'applicazione con comportamenti e funzionalità ad esso associati. Questo è più di quello che farà un DataTempate.

Un DataTemplate è associato a un DataType e visualizza un'immagine per quel tipo. Un UserControl può essere composto da più DataTypes e può includere comportamenti personalizzati.

Detto questo, trovo molto raramente la necessità di un UserControl. Uso DataTemplates dappertutto per modellare i miei dati e implementare i miei comportamenti attraverso i binding di dati e il pattern MVVM.

2

Chi 2.

direi che DataTemplates non sono progettati per essere utilizzati con il code-behind. Nella maggior parte dei casi è possibile utilizzare solo DataBinding e Comandi per collegare la logica tra il modello e la sua rappresentazione. Non avere code-behind facilita anche i test unitari della tua applicazione.

10

Personalmente, creo un UserControl e quindi creo un DataTemplate da quello. Questo ha i seguenti vantaggi, per me:

  1. Può essere utilizzato su Windows, solo ridefinendo la parte DataTemplate.
  2. È possibile utilizzare il code-behind (lo so, lo so, ma alcune cose sono molto più semplici usando il code-behind, non vedo il punto in inutile complicare il mio codice basato sul dogma).
  3. Supporto del progettista XAML.
Problemi correlati