DataTemplate与ItemContainerTemplate

and*_*eas 7 wpf xaml

ItemContainerTemplate用于什么?它是从DataTemplate派生的,但除了ItemContainerTemplateKey属性之外,我看不出它们之间有任何区别.我什么时候应该使用另一个?

Grx*_*x70 8

DataTemplate和之间的唯一区别ItemContainerTemplate是自动提供资源字典键的方式(假设它没有明确设置)。即,DataTemplate[DictionaryKeyProperty("DataTemplateKey")]属性修饰,DataTemplateKey基本上定义为:

public object DataTemplateKey
{
    get { return (DataType != null) ? new DataTemplateKey(DataType) : null; 
}
Run Code Online (Sandbox Code Playgroud)

请参阅DataTemplate 源以供参考。

ItemContainerTemplate派生自DataTemplate,但用[DictionaryKeyProperty("ItemContainerTemplateKey")]属性修饰(实际上取代了继承的),并且ItemContainerTemplateKey属性定义如下:

public object ItemContainerTemplateKey
{
    get { return (DataType != null) ? new ItemContainerTemplateKey(DataType) : null; }
}
Run Code Online (Sandbox Code Playgroud)

请参阅ItemContainerTemplate 源以供参考。

差异似乎很小 -DataTemplate返回 的实例DataTemplateKeyItemContainerTemplate返回 的实例ItemContainerTemplateKey(均源自TemplateKey)。所以基本上这两个是等价的1

<ItemContainerTemplate DataType="{x:Type sys:String}" />
<DataTemplate x:Key="{ItemContainerTemplateKey {x:Type sys:String}}" />
Run Code Online (Sandbox Code Playgroud)

这些也是:

<ItemContainerTemplate x:Key="{DataTemplateKey {x:Type sys:String}}" />
<DataTemplate DataType="{x:Type sys:String}" />
Run Code Online (Sandbox Code Playgroud)

这两者之间的主要实际区别在于DataTemplate,默认键被视为隐式模板2,而ItemContainerTemplate不是。实际上,您需要手动引用它,例如:

<ListBox ItemTemplate="{StaticResource {ItemContainerTemplate {x:Type sys:String}}}" />
Run Code Online (Sandbox Code Playgroud)

我不确定创建ItemContainerTemplate类背后的意图。我想它可以让您更清楚地了解代码,您知道这样的模板专门用于ItemsControl(或派生控件)。此外,我想编写一个可利用DataTemplateSelector此类的强可重用性将被证明是非常简单的。


1 在创建的对象属于不同类型的意义上,它们不是等价的,但在功能上它们是等价的。

2 隐式模板适用于范围内相应类型的所有对象,除非明确设置模板。


Moe*_*bai -1

您可以检查该链接以查看controltemplate和datatemplate以及hierarchicaldatatemplate itemspaneltemplate之间的区别:

http://nirajrules.wordpress.com/2009/03/08/controltemplate-vs-datatemplate-vs-hierarchicaldatatemplate-vs-itemspaneltemplate/