WPF - 在没有密钥的情况下在ResourceDictionary中定义DataTemplate

时间:2011-02-27 20:01:35

标签: wpf xaml

我已经多次看到这种形式的wpf代码示例:

<Window.Resources>
    <DataTemplate DataType="{x:Type SomeType}">
        <!-- Elements defining the DataTemplate-->
    </DataTemplate>
</Window.Resources>

我理解其用法,但我不明白为什么这个语法没问题:因为ResourceDictionary实现了IDictionary,所以我们添加到Resource属性的每个元素都必须指定一个键。现在我知道使用DictionaryKeyPropertyAttribute,类可以提供隐式键值 - 但是在DataTemplate类的情况下,提供的属性是“DataTemplateKey”。我知道这听起来有点小,但这个问题的动机是知道如何使用其他类,即使我没有权利看到之前的使用样本(也许是第三方......)。任何人吗?

1 个答案:

答案 0 :(得分:3)

正如您在问题中提到的,没有x:Key属性的条目使用DataTemplateKey(SomeType)作为关键字。您只能为资源中的特定SomeType指定一个此类实例。 DataTemplateKey派生自TemplateKeyResourceKey本身派生自{{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>

这导致资源字典中有三个条目。下方图片中的橙色箭头指向DataTemplateKeyButton类型的基于TextBlock的条目,而红色箭头指向{{的特定(键入)条目密钥资源:

enter image description here