Рассмотрим следующий XAML файл:Почему х: ключ требуется ControlTemplate в ResourceDictionary
<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>
Это дает следующие компиляции ошибка:
All objects added to an IDictionary must have a Key attribute or some other type of key associated with them. Line 10 Position 10.
Если добавить атрибут x:key
к ControlTemplate, он компилируется. Однако я не должен был этого делать. ControlTemplate украшен атрибутом DictionaryKeyProperty, который определяет TargetType как свойство ключа. Поэтому до тех пор, пока я укажу TargetType для моего ControlTemplate, я должен указать , а не, чтобы указать явный ключ (аналогично тому, как я не должен указывать один из определяемого DataTemplate).
У меня есть второй и касательный вопрос. Если я определяю ControlTemplate таким образом (либо указывая ключ или нет) в XAML, он автоматически применяется ко всем элементам управления типа ContentControl, которые не указывают другой шаблон, или мне нужно будет вставить ControlTemplate внутри стиля для этого?
Это отвечает на вторую часть моего вопроса. Я знаю, что мне нужно указать x: Key, если я хочу ссылаться на шаблон в другом месте документа, но его отсутствие не должно вызывать ошибку компиляции. – luksan
Я обновил свой ответ. Это швы 'DictionaryKeyProperty' не делает то, что должно быть ... – nemesv
Проблема с DictionaryKeyProperty, похоже, не влияет на все типы, так как атрибут работает так, как указано в DataTemplate. Проблема с подключением - с 2009 года. Наверное, я просто напишу это как еще одну вещь в WPF, которая просто не работает и никогда не была тщательно протестирована. Каждый раз, когда я пытаюсь что-то развить в WPF, я сталкиваюсь с этими типами проблем. Это никогда не происходит с Windows Forms, все просто работает. Я действительно думал (возможно, желаю), что они собираются сделать WPF более предсказуемым/полезным в версии 4.0. – luksan