最近我尝试在我的应用程序中重用一些UI元素。当我开始使用WPF编程时,有人告诉我DataTemplate是重用UI元素的最佳方式。您可以为数据实体定义模板并在任何地方使用它。听起来非常不错。
然而,我也发现了一些缺点,特别是和UserControl相比较时:
你不能在另一个Window或UserControl中重用定义的DataTemplate。例如,如果UserDataTemplate在WindowA.xaml中定义,您无法在WindowB.xaml中使用它。解决方案可能是将DataTemplate作为全局资源字典中的资源。
DataTemplate很难具有一些代码后台。如第1项所述,如果将DataTemplate放置在ResourceDictionary中,则默认情况下没有放置代码的位置。我谷歌了这个问题,是的,我找到了一个诀窍,使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只会有一个实例,但是一旦应用了DataTemplate,就会创建一个User2实例,这意味着如果多次应用datatemplate,则User2将有多个实例。
然而,与UserControl不同的是,"mousePos"字段将不会有多个副本。如果DataTemplate被应用100次,则mousePos不会有100个副本,这意味着100个网格将同时使用唯一的mousePos字段,可能会导致问题。
在UserControl中,您定义的字段只会被控件使用。100个UserControl实例将有100个字段副本。也许我使用DataTemplate的方式不正确,欢迎任何评论。
最好的问候, Zach