Ошибка связывания шаблона
Я разрабатываю пользовательский элемент управления, который имеет свойство зависимости
public static readonly DependencyProperty StateBorderBrushProperty =
DependencyProperty.Register("StateBorderBrush", typeof(Brush), typeof(SmartCanvas),
new FrameworkPropertyMetadata(Brushes.Transparent,
FrameworkPropertyMetadataOptions.None));
Проблема возникает, когда я пытаюсь установить ControlTemplate моего элемента управления из-за пределов xaml, как
<ControlTemplate TargetType="controls:SmartPrimitive">
<Grid>
<ContentPresenter/>
<Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
</Grid>
</ControlTemplate>
Это звучит как "XamlParseException: данный ключ не присутствовал в словаре" в строке с TemplateBinding выше. Что может быть не так?
3 ответа
Я только что ошибся с типом владельца DependencyProperty. Это должен быть SmartPrimitive, а не SmartCanvas. Но... WPF исключение может быть более информативным.
Вы пропустили {x:Type }
декларация
<ControlTemplate TargetType="{x:Type controls:SmartPrimitive}">
<Grid>
<ContentPresenter/>
<Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
</Grid>
</ControlTemplate>
Это означает, что вы предоставляете строку для TargetType вместо Type
Расширение разметки x:Type обеспечивает поведение преобразования from-string для свойств, принимающих тип Type. Входные данные имеют тип XAML.
http://msdn.microsoft.com/en-us/library/ms753322%28v=vs.110%29.aspx
У меня была аналогичная проблема в подобном случае. Поэтому я поискал его и обнаружил, что в данном случае это не может быть TemplateBinding.
Как ответ и объяснение Сивасубраманяна здесь -> Использование TemplateBinding в ControlTemplate.Triggers
В TemplateBinding: внимательно посмотрите на это, разрешенное значение Max:MyControl.Bar будет действовать как ключ ресурса для привязки шаблона [Здесь значение Bar не является фактическим значением, вместо этого это имя ключа свойства ] которого не существует, поэтому он выдает ошибку «Данный ключ отсутствует в словаре».
Итак, в основном, изменение TemplateBinding на Binding
<ControlTemplate TargetType="{x:Type controls:SmartCanvas}">
<Grid>
<ContentPresenter/>
<Border BorderBrush="{Binding StateBorderBrush, UpdateSourceTrigger=PropertyChanged}" BorderThickness="2"/>
</Grid>