我已经多次看到这种形式的wpf代码示例:
<Window.Resources>
<DataTemplate DataType="{x:Type SomeType}">
<!-- Elements defining the DataTemplate-->
</DataTemplate>
</Window.Resources>
我理解其用法,但我不明白为什么这个语法没问题:因为ResourceDictionary实现了IDictionary,所以我们添加到Resource属性的每个元素都必须指定一个键。现在我知道使用DictionaryKeyPropertyAttribute,类可以提供隐式键值 - 但是在DataTemplate类的情况下,提供的属性是“DataTemplateKey”。我知道这听起来有点小,但这个问题的动机是知道如何使用其他类,即使我没有权利看到之前的使用样本(也许是第三方......)。任何人吗?
答案 0 :(得分:3)
正如您在问题中提到的,没有x:Key
属性的条目使用DataTemplateKey(SomeType)作为关键字。您只能为资源中的特定SomeType
指定一个此类实例。 DataTemplateKey派生自TemplateKey,ResourceKey本身派生自{{3}}。当然,这样的DataTemplate资源定义可以出现在许多类型中,保持唯一,因为每个相应类型的DataTemplateKey都是唯一的。
例如,请考虑以下资源定义:
<Window.Resources>
<!-- Generic Button data template -->
<DataTemplate DataType="{x:Type Button}">
<!-- Elements defining the DataTemplate-->
</DataTemplate>
<!-- Generic TextBlock data template -->
<DataTemplate DataType="{x:Type TextBlock}">
<!-- Elements defining the DataTemplate-->
</DataTemplate>
<!-- Specific Button data template -->
<DataTemplate x:Key="SpecialButton" DataType="{x:Type Button}">
<!-- Elements defining the DataTemplate-->
</DataTemplate>
</Window.Resources>
这导致资源字典中有三个条目。下方图片中的橙色箭头指向DataTemplateKey
和Button
类型的基于TextBlock
的条目,而红色箭头指向{{的特定(键入)条目密钥资源: