2009-11-27 19 views
20

Ostatnio próbuję ponownie użyć niektórych elementów interfejsu użytkownika w mojej aplikacji. Kiedy zacząłem programować z WPF, powiedziano mi, że DataTemplate to najlepszy sposób na ponowne wykorzystanie elementów interfejsu użytkownika. Możesz zdefiniować szablon dla swojej encji danych i używać go wszędzie. Brzmi bardzo dobrze. Jednak znalazłem także pewne wady, szczególnie w porównaniu z UserControl.WPF, UserControl lub DataTemplate

  1. Nie można ponownie użyć DataTemplate zdefiniowanego w innym oknie lub UserControl. Na przykład, jeśli UserDataTemplate jest zdefiniowany w WindowA.xaml, nie możesz go użyć w WindowB.xaml. Rozwiązaniem może być umieszczenie DataTemplate jako zasobu w globalnym słowniku zasobów.
  2. DataTemplate trudno mieć za sobą jakiś kod. Jak wspomniano w punkcie 1, jeśli umieścisz DataTemplate w ResourceDictionary, nie ma miejsca na domyślne umieszczenie kodu. Przeanalizowałem ten problem i tak, znalazłem sztuczkę, aby ResourceDictionary miał plik cs. Ale wciąż ma inny problem.
  3. Innym problemem DataTemplate jest to, że musisz wyraźnie odróżniać instancję samego DataTemplate od instancji zawartości DataTemplate. DataTemplate będzie miał tylko jedną "instancję DataTemplate" i może mieć wiele instancji zawartości DataTemplate. Pozwól mi wyjaśnić to na przykładzie:

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

Wynik będzie, że: Użytkownik 1 będzie miał tylko jedną instancję, jednak instancja User2 zostanie utworzone, gdy DataTemplate jest stosowane, co oznacza User2 będą miały wiele instancji, jeśli datatemplate jest stosowane wielokrotnie. Jednak w przeciwieństwie do UserControl, pole "mousePos" NIE będzie zawierało wielu kopii. Jeśli DataTemplate zostanie zastosowany 100 razy, mousePos nie będzie miał 100 kopii, co oznacza, że ​​100 Grids użyje tylko jednego pola mousePos w tym samym czasie, co może powodować problemy. W UserControl zdefiniowane pole będzie używane tylko przez kontrolkę. 100 instancji UserControl będzie miało 100 kopii pola.

Być może używam DataTemplate w niewłaściwy sposób. Każdy komentarz jest doceniany.

poważaniem,

Zach

Odpowiedz

25

Koncepcyjnie DataTemplates i UserControls rozwiązują dwa różne problemy. Nie są one naprawdę wymienne, więc porównania nie są dokładne.

DataTemplates dotyczą stosowania stylu wizualnego do DataType. Zazwyczaj oznacza to, że mam własną klasę .NET o nazwie Foo i chcę nadać jej styl wizualny. Zrobiłbym to poprzez stworzenie DataTemplate z DataType of Foo.

Mogę następnie umieścić DataTemplate w mojej aplikacji (powiedzmy w App.XAML) i będę miał mój styl wizualny zastosowany do mojego obiektu danych Foo, gdziekolwiek jest on używany. Często oznacza to, że zobaczysz ContentControl, który ma właściwość Content powiązaną z właściwością typu Foo.

UserControls z drugiej strony dotyczyły organizacji XAML. Kontrola użytkownika pomaga w porządkowaniu fragmentów XAML, które chcesz ponownie wykorzystać w aplikacji, która ma powiązane z nią zachowania i funkcje. To więcej niż to, co zrobi DataTempate.

DataTemplate jest przypisany do jednego DataType i wyświetla obraz tego typu. UserControl może składać się z wielu DataTypes i może zawierać niestandardowe zachowania.

W związku z tym bardzo rzadko zdarza się, że potrzebuję funkcji UserControl. Używam DataTemplates wszędzie, aby modelować moje dane i implementować moje zachowania, chociażby powiązania danych i wzorzec MVVM.

2

O 2.

Powiedziałbym, że DataTemplates nie są przeznaczone do stosowania z kodu źródłowego. W większości przypadków można używać tylko DataBinding i Commands do połączenia logiki między modelem i jego reprezentacją. Brak dostępu do kodu również ułatwia testy jednostkowe aplikacji.

10

Osobiście tworzę narzędzie UserControl, a następnie utworzę z niego DataTemplate. Ma to następujące zalety: dla mnie:

  1. Można używać w oknach tylko przez ponowne zdefiniowanie części DataTemplate.
  2. Potrafi korzystać z kodu źródłowego (wiem, wiem, ale niektóre rzeczy są o wiele łatwiejsze za pomocą kodu z tyłu, nie widzę sensu w niepotrzebnym komplikowaniu mojego kodu na podstawie dogmatu).
  3. Wsparcie projektanta XAML.
Powiązane problemy