Недавно я пытаюсь повторно использовать некоторые элементы пользовательского интерфейса в своем приложении. Когда я начал программировать с помощью WPF, мне сказали, что DataTemplate - лучший способ повторного использования элементов интерфейса. Вы можете определить шаблон для своего объекта данных и использовать его повсюду. Звучит очень хорошо. Однако я также обнаружил некоторые недостатки, особенно когда их сравнивают с UserControl.
- Вы не можете повторно использовать DataTemplate, определенные в другом окне или UserControl. Например, если UserDataTemplate определяется в WindowA.xaml, вы не можете использовать его в WindowB.xaml. Возможно, это решение помещает DataTemplate в качестве ресурса в глобальный словарь ресурсов.
- DataTemplate трудно содержать какой-то код. Как упоминалось в пункте 1, если вы поместили DataTemplate в ResourceDictionary, поместить код по умолчанию нецелесообразно. Я googled проблема, и да, я нашел трюк, чтобы заставить ResourceDictionary иметь файл cs. Но у него все еще есть другая проблема.
-
Другая проблема DataTemplate заключается в том, что вы должны четко понимать разницу между экземпляром самой DataTemplate и экземплярами содержимого DataTemplate. DataTemplate будет иметь только один "экземпляр DataTemplate" и может иметь много экземпляров содержимого DataTemplate. Позвольте мне объяснить это с помощью примера:
<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...; } }
Результат будет таким, что: User1 будет иметь только один экземпляр, однако экземпляр User2 будет создан после применения DataTemplate, что означает, что User2 будет иметь много экземпляров, если набор данных применяется много раз. Однако, в отличие от UserControl, поле "mousePos" НЕ будет иметь много копий. Если DataTemplate применяется 100 раз, mousePos не будет иметь 100 копий, что означает, что 100 Grids будут использовать только одно поле mousePos в одно и то же время, что может вызвать проблемы. В UserControl поле, которое вы определили, будет использоваться только элементом управления. 100 экземпляров UserControl будут иметь 100 копий полей.
Возможно, я использую DataTemplate неправильно. Любые комментарии приветствуются.
С уважением,
Зак