从代码中,如何创建绑定到附加属性中存储的对象的属性?

时间:2015-10-01 15:03:49

标签: c# wpf binding propertypath

我们有一个存储对象的继承附加属性。在可视化树的下方,我们希望从代码绑定到该对象上的属性。

通常我们构造一个绑定的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)

...从存储在第一个附加属性中的对象获取第二个附加属性的值。

1 个答案:

答案 0 :(得分:2)

我刚刚确认我之前的怀疑是正确的。这里只需要绑定到另一个附加属性中存储的值的附加属性...

Path = new PropertyPath("(0).(1)",
    SomeClass.SomeAttachedProperty,
    SomeOtherClass.SomeOtherAttachedProperty)

如更新中所述,对于简单属性,这也是有效的。

Path = new PropertyPath(SomeClass.SomeAttachedProperty)

......基本上相当于......

Path = new PropertyPath("(0)",
    SomeClass.SomeAttachedProperty)