Почему x:key требуется для ControlTemplate в ResourceDictionary

Рассмотрите следующий файл XAML:

<Window x:Class="ExpressionVisualizer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sle="clr-namespace:System.Linq.Expressions;assembly=System.Core"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type sle:BinaryExpression}"/>
        <ControlTemplate TargetType="{x:Type ContentControl}"/>
    </Window.Resources>
</Window>

Это дает следующая ошибка компиляции:

Все объекты, добавляемые в IDictionary, должны иметь атрибут Key или какой-либо другой тип ключа, связанный с ними. Строка 10 Позиция 10.

Если я добавлю атрибут x:key в ControlTemplate, он скомпилируется. Однако я не должен был этого делать. ControlTemplate украшен атрибутом DictionaryKeyProperty, который указывает TargetType в качестве свойства ключа. Поэтому, пока я указываю TargetType для моего ControlTemplate, я должен не указывать явный ключ (аналогично тому, как мне не нужно указывать его в DataTemplate, который я определил).

У меня есть второй и косвенный вопрос. Если я определяю ControlTemplate таким образом (указав ключ или нет) в XAML, будет ли он автоматически применяться ко всем элементам управления типа ContentControl, которые не указывают другой шаблон, или мне придется встраивать ControlTemplate внутри Style чтобы это произошло?

8
задан luksan 3 March 2012 в 20:19
поделиться