我开发了一个具有依赖属性
的自定义控件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:字典中没有给定的键”。 可能有什么不对?
答案 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>