considere el siguiente archivo XAML:Por qué es X: No se requiere clave de ControlTemplate en el 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>
Esto está dando el siguiente error de compilación:
All objects added to an IDictionary must have a Key attribute or some other type of key associated with them. Line 10 Position 10.
Si añado un atributo x:key
a la ControlTemplate, compila. Sin embargo, no debería tener que hacer eso. ControlTemplate está decorado con el atributo DictionaryKeyProperty que especifica TargetType como la propiedad clave. Así que mientras especifique un TargetType para mi ControlTemplate, debería no tener que especificar una clave explícita (similar a cómo no tengo que especificar uno en el DataTemplate que he definido).
Tengo una segunda pregunta relacionada de manera tangencial. Si defino una plantilla de control de esta manera (ya sea especificando una clave o no) en XAML, ¿se aplica automáticamente a todos los controles de tipo ContentControl que no especifican otra plantilla o tendré que incrustar la plantilla de control dentro de un estilo? para que eso ocurra?
Eso responde la segunda parte de mi pregunta. Sé que necesito especificar una clave x: si quiero hacer referencia a la plantilla en otro lugar del documento, pero omitirla no debería causar un error de compilación. – luksan
He actualizado mi respuesta. Comprueba 'DictionaryKeyProperty' no está haciendo lo que debería ser ... – nemesv
El problema con DictionaryKeyProperty parece no afectar a todos los tipos, ya que el atributo funciona como se especifica en DataTemplate. El problema de Connect es de 2009. Supongo que solo escribiré esto como algo más en WPF que simplemente no funciona y nunca fue probado exhaustivamente. Cada vez que intento desarrollar algo en WPF me tropiezo con este tipo de problemas. Esto nunca ocurre con Windows Forms, todo funciona. Realmente pensé (quizás desearía) que harían que WPF sea más predecible/utilizable en la versión 4.0. – luksan