WPF,UserControl或DataTemplate

Zac*_*ach 23 wpf user-controls datatemplate

最近我试图在我的应用程序中重用一些UI元素.当我开始使用WPF编程时,我被告知DataTemplate是重用UI元素的最佳方式.您可以为数据实体定义模板并在任何地方使用它.听起来很不错.但是,我也发现了一些缺点,特别是在与UserControl进行比较时.

  1. 您不能重用在另一个Window或UserControl中定义的DataTemplate.例如,如果在WindowA.xaml中定义了UserDataTemplate,则无法在WindowB.xaml中使用它.解决方案可能是将DataTemplate作为资源放在全局资源字典中.
  2. DataTemplate很难有一些代码.如第1项所述,如果将DataTemplate放在ResourceDictionary中,则默认情况下无法放置代码.我搜索了问题,是的,我发现了一个让ResourceDictionary有一个cs文件的技巧.但它还有另一个问题.
  3. 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...;
            }
    }
    
    Run Code Online (Sandbox Code Playgroud)

结果是:User1将只有一个实例,但是,一旦应用DataTemplate,将创建User2实例,这意味着如果多次应用datatemplate,User2将有许多实例.但是,与UserControl不同,字段"mousePos"不会有很多副本.如果正在应用的DataTemplate 100次,mousePos结构不会有100份,这意味着100个电网将使用的唯一一个mousePos结构字段作为同一时间,这可能会导致问题.在UserControl中,您定义的字段仅由控件使用.100个UserControl实例将具有100个字段副本.

也许我以错误的方式使用DataTemplate.任何评论表示赞赏.

最好的祝福,

扎克

Bra*_*ham 28

从概念上讲,DataTemplates和UserControl解决了两个不同的问题.它们并不是真正可以互换的,因此您的比较并不准确.

DataTemplates都是关于将视觉样式应用于DataType.通常这意味着我有自己的.NET类叫做Foo,我想给它一个视觉风格.我会通过创建DataType为Foo的DataTemplate来实现这一点.

然后,我可以把这个DataTemplate中在我的应用程序(在App.xaml中说),我将应用到我的数据对象美孚我的视觉风格无论在何处使用.通常这意味着您将看到ContentControl,其Content属性绑定到Foo类型的属性.

另一方面的UserControls都是关于XAML的组织.用户控件有助于组织您希望在整个应用程序中重用的XAML块,这些块具有与之关联的行为和功能.这不仅仅是DataTempate的功能.

DataTemplate绑定到一个DataType并显示该类型的可视化.UserControl可以由多个DataType组成,并且可以包含自定义行为.

话虽这么说,我很少发现需要UserControl.我使用DataTemplates来模拟我的数据并通过数据绑定和MVVM模式实现我的行为.


Gro*_*kys 11

就个人而言,我创建一个UserControl,然后从中创建一个DataTemplate.这对我有好处:

  1. 可以跨窗口使用,只需重新定义DataTemplate部件即可.
  2. 可以使用代码隐藏(我知道,我知道,但有些事情使用代码隐藏更容易,我没有看到基于教条的不必要的复杂化代码).
  3. XAML设计师支持.