我们有一个存储对象的继承附加属性。在可视化树的下方,我们希望从代码绑定到该对象上的属性。
通常我们构造一个绑定的Path部分,就像这样......
var someBinding = new Binding()
{
Path = new PropertyPath(AttachedPropertyOwner.SomeAttachedProperty),
RelativeSource = new RelativeSource(RelativeSourceMode.Self)
};
这样可行,但我们现在想要存储在SomeAttachedProperty
中的对象的属性。我认为我们应该使用字符串表示法?
另外,在研究这个时,我在MSDN上发现了这个:Property Path Syntax
相关部分位于“PropertyPathInCode”标题下
如果从DependencyProperty构造PropertyPath,则该PropertyPath不能用作Binding.Path,它仅可用于动画定位。从DependencyProperty构造的PropertyPath的Path值是字符串值(0),它是绑定引擎用于无效路径的标记值。
...这对我来说没有意义,因为它似乎工作正常。我错过了什么吗?我们所有的代码绑定都做错了吗?
阅读MSDN文档评论(我错过的是Silverlight,但我认为在这种情况下不重要),它表示你不能使用依赖 属性 。但是,它说你可以使用DependencyProperty 标识符 ,标识符是从Register方法返回的标识符。
换句话说,我认为他们所说的是我们正在做的事情是有效的......
var someBinding = new Binding()
{
Path = new PropertyPath(CarClass.WheelCountProperty)
};
......但事实并非如此。
var someBinding = new Binding()
{
Path = new PropertyPath(MyCarInstance.WheelCount)
};
看来确认这一点,在引擎盖下,Reflector表明它实际上只是这样做......
public PropertyPath(object value)
: this("(0)", new [] { value })
{
....
}
...所以我认为恐慌是一个红色的鲱鱼。
我认为这也意味着我可以像我这样做我想做的事情......
Path = new PropertyPath("(0).(1)",
SomeClass.SomeAttachedProperty,
SomeOtherClass.SomeOtherAttachedProperty)
...从存储在第一个附加属性中的对象获取第二个附加属性的值。
答案 0 :(得分:2)
我刚刚确认我之前的怀疑是正确的。这里只需要绑定到另一个附加属性中存储的值的附加属性...
Path = new PropertyPath("(0).(1)",
SomeClass.SomeAttachedProperty,
SomeOtherClass.SomeOtherAttachedProperty)
如更新中所述,对于简单属性,这也是有效的。
Path = new PropertyPath(SomeClass.SomeAttachedProperty)
......基本上相当于......
Path = new PropertyPath("(0)",
SomeClass.SomeAttachedProperty)