最近我试图在我的应用程序中重用一些UI元素。当我开始使用WPF编程时,我被告知DataTemplate是重用UI元素的最佳方式。您可以为您的数据实体定义一个模板,并在任何地方使用它。听起来很不错。 但是,我还发现一些缺点,尤其是与UserControl进行比较时。WPF,UserControl或DataTemplate
- 您不能重用在另一个Window或UserControl中定义的DataTemplate。例如,如果UserDataTemplate在WindowA.xaml中定义,则不能在WindowB.xaml中使用它。解决方案可能是将DataTemplate作为全局资源字典中的资源。
- DataTemplate很难有一些代码。如第1项所述,如果将DataTemplate放入ResourceDictionary中,则默认情况下没有地方放置代码。我GOOGLE了这个问题,是的,我发现一个技巧,使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...; } }
的结果将是:用户1只会有一个实例,但是,用户2实例将一旦施加的DataTemplate,这意味着用户2将创建很多情况下,如果多次应用数据模板。 但是,与UserControl不同,“mousePos”字段不会有多个副本。如果DataTemplate应用了100次,mousePos将不会有100个副本,这意味着100个网格将同时使用唯一的一个mousePos字段,这可能会导致问题。 在UserControl中,您定义的字段只能由控件使用。 100个UserControl实例将有100个字段副本。
也许我在错误的道路使用的DataTemplate。任何意见表示赞赏。
最好的问候,
扎克