Недавно я пытаюсь повторно использовать некоторые элементы пользовательского интерфейса в своем приложении. Когда я начал программировать с помощью WPF, мне сказали, что DataTemplate - лучший способ повторного использования элементов интерфейса. Вы можете определить шаблон для своего объекта данных и использовать его повсюду. Звучит очень хорошо. Однако я также обнаружил некоторые недостатки, особенно если сравнивать с UserControl.WPF, UserControl или DataTemplate
- Вы не можете повторно использовать 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 будет иметь только один экземпляр, однако, экземпляр Пользователь2 будет создан после того, как DataTemplate применяется, что означает Пользователь2 будет многие случаи, если набор данных применяется много раз. Однако, в отличие от UserControl, поле «mousePos» НЕ будет иметь много копий. Если DataTemplate применяется 100 раз, mousePos не будет иметь 100 копий, что означает, что 100 Grids будут использовать только одно поле mousePos в одно и то же время, что может вызвать проблемы. В UserControl поле, которое вы определили, будет использоваться только элементом управления. 100 экземпляров UserControl будут иметь 100 копий полей.
Возможно, я использую DataTemplate неправильно. Любые комментарии приветствуются.
С наилучшими пожеланиями,
Zach