WPF,UserControl或DataTemplate是什么?

26

最近我尝试在我的应用程序中重用一些UI元素。当我开始使用WPF编程时,有人告诉我DataTemplate是重用UI元素的最佳方式。您可以为数据实体定义模板并在任何地方使用它。听起来非常不错。

然而,我也发现了一些缺点,特别是和UserControl相比较时:

  1. 你不能在另一个Window或UserControl中重用定义的DataTemplate。例如,如果UserDataTemplate在WindowA.xaml中定义,您无法在WindowB.xaml中使用它。解决方案可能是将DataTemplate作为全局资源字典中的资源。

  2. DataTemplate很难具有一些代码后台。如第1项所述,如果将DataTemplate放置在ResourceDictionary中,则默认情况下没有放置代码的位置。我谷歌了这个问题,是的,我找到了一个诀窍,使ResourceDictionary拥有cs文件。但它仍然有另一个问题。

  3. DataTemplate的另一个问题是您必须清楚DataTemplate本身的实例与DataTemplate内容的实例之间的区别。DataTemplate只会有一个"DataTemplate实例",并且可能有许多DataTemplate内容的实例。让我用一个例子来解释:

  4. <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
3个回答

34

概念上,DataTemplates和UserControls解决的是两个不同的问题。它们并不能真正交换使用,因此您的比较并不准确。

DataTemplates的作用是将视觉样式应用于数据类型。通常,这意味着我有自己的.NET类称为Foo,并且我想为它提供一个视觉样式。我将通过创建一个DataType为Foo的DataTemplate来实现这一点。

然后,我可以将这个DataTemplate放在我的应用程序中(例如在App.XAML中),并且无论在哪里使用我的数据对象Foo,都将应用我的视觉样式。通常这意味着你会看到一个ContentControl,它有一个Content属性绑定到一个类型为Foo的属性。

另一方面,UserControls则是关于组织XAML的。用户控件有助于组织你希望在整个应用程序中重复使用的大块XAML,而且与其相关联的还有行为和功能。这比DataTempate能够做到的更多。

DataTemplate与一个DataType相关联,并显示该类型的可视化内容。UserControl可以由多个DataType组成,并且可以包含自定义行为。

话虽如此,我很少需要UserControl。我在数据建模和实现我的行为方面始终使用DataTemplates以及数据绑定和MVVM模式。


12

我个人喜欢创建一个UserControl并从中制作DataTemplate。对我来说,这有以下优点:

  1. 通过重新定义DataTemplate部分,可以跨窗口使用。
  2. 可以使用代码后台(我知道,我知道,但有些事情使用代码后台会更容易,我不认为根据教条无谓地复杂化我的代码有意义)。
  3. XAML设计师支持。

2

关于2.

我认为DataTemplates并不是设计用于与code-behind一起使用的。您可以在大多数情况下只使用数据绑定和命令来连接模型和其表示之间的逻辑。没有code-behind也会方便您应用程序的单元测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接