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