DataTemplate与ItemContainerTemplate
什么是ItemContainerTemplate用于? 它是从DataTemplate派生的,但除了ItemContainerTemplateKey属性之外,我没有看到它们之间的区别。 我应该什么时候使用一个,何时使用另一个?
ItemContainerTemplate描述你的物品周围的世界。 例如,在ListBox中围绕ListBoxItem的选择矩形。 DataTemplate描述了ListBoxItem的apears以及它由哪些元素组成。
WPF博士做了一个很好的例子:http://drwpf.com/blog/category/item-containers/
您可以将一个ItemContainerTemplate
放在ResourceDictionary
,并且它会自动使用DataType
作为其键。
这是唯一的区别。
DataTemplate
和ItemContainerTemplate
之间唯一的区别是资源字典关键字自动提供的方式(假设它没有明确设置)。 也就是说, 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
返回的实例DataTemplateKey
和ItemContainerTemplate
返回的实例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