Рассмотрите следующий файл 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 чтобы это произошло?