DataTemplate与ItemContainerTemplate

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


ItemContainerTemplate描述你的物品周围的世界。 例如,在ListBox中围绕ListBoxItem的选择矩形。 DataTemplate描述了ListBoxItem的apears以及它由哪些元素组成。

WPF博士做了一个很好的例子:http://drwpf.com/blog/category/item-containers/


您可以将一个ItemContainerTemplate放在ResourceDictionary ,并且它会自动使用DataType作为其键。

这是唯一的区别。


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

public object DataTemplateKey
{
    get { return (DataType != null) ? new DataTemplateKey(DataType) : null; 
}

请参阅DataTemplate源以供参考。

ItemContainerTemplate派生自DataTemplate ,但装饰有[DictionaryKeyProperty("ItemContainerTemplateKey")]属性(实际上替换了继承的),而ItemContainerTemplateKey属性的定义如下:

public object ItemContainerTemplateKey
{
    get { return (DataType != null) ? new ItemContainerTemplateKey(DataType) : null; }
}

请参阅ItemContainerTemplate来源以供参考。

所不同的,似乎小- DataTemplate返回的实例DataTemplateKeyItemContainerTemplate返回的实例ItemContainerTemplateKey (来自派生TemplateKey )。 所以基本上这两个是等价的1:

<ItemContainerTemplate DataType="{x:Type sys:String}" />
<DataTemplate x:Key="{ItemContainerTemplateKey {x:Type sys:String}}" />

这些也是如此:

<ItemContainerTemplate x:Key="{DataTemplateKey {x:Type sys:String}}" />
<DataTemplate DataType="{x:Type sys:String}" />

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

<ListBox ItemTemplate="{StaticResource {ItemContainerTemplate {x:Type sys:String}}}" />

我不确定创建ItemContainerTemplate类的意图。 我想它给你一个更清晰的代码概述,你知道这样的模板专门用于ItemsControl (或派生控件)中。 另外,我想这会很简单,编写一个强大的可重用DataTemplateSelector来利用这个类。


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

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

链接地址: http://www.djcxy.com/p/20629.html

上一篇: DataTemplate vs ItemContainerTemplate

下一篇: Xamarin.Android JmDNS binding issues