Ошибка связывания шаблона

Я разрабатываю пользовательский элемент управления, который имеет свойство зависимости

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>
Другие вопросы по тегам