TemplateBinding错误

时间:2014-11-28 15:28:47

标签: wpf user-controls custom-controls templatebinding

我开发了一个具有依赖属性

的自定义控件
public static readonly DependencyProperty StateBorderBrushProperty =
        DependencyProperty.Register("StateBorderBrush", typeof(Brush), typeof(SmartCanvas),
        new FrameworkPropertyMetadata(Brushes.Transparent,
            FrameworkPropertyMetadataOptions.None));

当我尝试从xaml外部设置我的控件的ControlTemplate时出现问题,如

<ControlTemplate TargetType="controls:SmartPrimitive">
                    <Grid>
                        <ContentPresenter/>
                        <Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
                    </Grid>
                </ControlTemplate>

听起来像上面的TemplateBinding字符串中的“XamlParseException:字典中没有给定的键”。 可能有什么不对?

3 个答案:

答案 0 :(得分:1)

您错过了{x:Type }声明

<ControlTemplate TargetType="{x:Type controls:SmartPrimitive}">
     <Grid>
         <ContentPresenter/>
         <Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
     </Grid>
</ControlTemplate>

这意味着您要向TargetType提供字符串而不是Type

  

x:Type标记扩展为采用Type类型的属性提供from-string转换行为。输入是XAML类型。

http://msdn.microsoft.com/en-us/library/ms753322%28v=vs.110%29.aspx

答案 1 :(得分:1)

我刚刚使用DependencyProperty所有者的类型拼错了。它应该是SmartPrimitive,而不是SmartCanvas。但是...... WPF异常可能会提供更多信息。

答案 2 :(得分:0)

我在类似的情况下遇到了类似的问题。于是搜索了一下,发现这种情况下不能是TemplateBinding。

就像这里 Sivasubramanian 的回答和解释一样 -> Using a TemplateBinding in 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>