模板绑定的局限性

4

一个自定义控件(在VS 2008下编写)具有SelectedColor依赖属性,其控件模板包含以下内容:

...
<Rectangle>
  <Rectangle.Fill>
    <SolidColorBrush Color="{TemplateBinding SelectedColor}"/>
  </Rectangle.Fill>
</Rectangle>
...

只有将绑定替换为以下内容,矩形才会具有正确的颜色:

...
<Rectangle>
  <Rectangle.Fill>
    <SolidColorBrush Color="{Binding SelectedColor, RelativeSource={RelativeSource TemplatedParent}}"/>
  </Rectangle.Fill>
</Rectangle>
...

好的,我知道TemplateBinding是Binding的简化版本,并且它有一些限制,那么是哪个具体的限制导致上面的代码无法工作呢?


根据[MSDN] (http://msdn.microsoft.com/en-us/library/ms742882.aspx)的说法,它们是两种类似的表示法。您是否尝试使用显式的`Path=`? - Philippe Lavoie
3
我以前也遇到过这个问题。除了“TemplateBinding”不支持嵌套路径外,我从未能够找出具体的区别。因此,我通常默认使用“TemplateBinding”(性能更好),如果它不起作用,就切换到“Binding”。虽然有些烦人,但这是我的处理方法。 - Kent Boogaart
1
@Philippe Lavoie - 问题在于使用TemplateBinding,其他符号也无法解决。 - Ury Jamshy
1
两种表示法的区别在于,TemplateBinding 是在编译时处理,而带有相对源的 Binding 是在运行时处理。您可以查看此文章:https://dev59.com/pHNA5IYBdhLWcg3wAIzd虽然这并不能解决您的问题。 - MatthiasG
1个回答

2

TemplateBinding非常不同。将它们视为模板应用时的简单值分配。 由于您的SelectedItem在运行时更改,因此需要实际绑定以进行属性更改通知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接