ItemContainerTemplate用于什么?它是从DataTemplate派生的,但除了ItemContainerTemplateKey属性之外,我看不出它们之间有任何区别.我什么时候应该使用另一个?
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返回 的实例DataTemplateKey并ItemContainerTemplate返回 的实例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之间的区别:
| 归档时间: |
|
| 查看次数: |
4941 次 |
| 最近记录: |