Как из кода создать привязку к свойству объекта, хранящегося в прикрепленном свойстве?

У нас есть наследуемое присоединенное свойство, в котором хранится объект. Дальше по визуальному дереву мы хотим привязать свойство к этому объекту из кода.

Обычно мы создаем часть пути привязки следующим образом...

var someBinding = new Binding()
{
    Path = new PropertyPath(AttachedPropertyOwner.SomeAttachedProperty),
    RelativeSource = new RelativeSource(RelativeSourceMode.Self)
}; 

Это работает, но теперь нам нужно свойство объекта, хранящееся в SomeAttachedProperty. Я так понимаю, мы должны использовать строковое представление?

Кроме того, исследуя это, я нашел это в MSDN: Синтаксис пути свойства

Соответствующая часть находится под заголовком «PropertyPathInCode».

Если вы создаете PropertyPath из DependencyProperty, этот PropertyPath нельзя использовать в качестве Binding.Path, его можно использовать только для нацеливания анимации. Значение Path для созданного PropertyPath из DependencyProperty — это строковое значение (0), которое является контрольным значением, используемым механизмом привязки для недопустимого пути.

... что для меня не имеет смысла, так как, похоже, работает нормально. Я что-то упускаю? Делали ли мы все наши привязки кода неправильно?

Обновлять

Читая комментарий к документации MSDN (который я пропустил, это Silverlight, но я не думаю, что это имеет значение в данном случае), он говорит, что вы не можете использовать Dependency Property. Однако в нем говорится, что вы можете использовать идентификатор 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)

... который получает значение второго присоединенного свойства из объекта, хранящегося в первом присоединенном свойстве.


person Mark A. Donohoe    schedule 01.10.2015    source источник


Ответы (1)


Я только что подтвердил, что мои прежние подозрения были верны. Вот все, что вам нужно сделать, чтобы привязать к присоединенному свойству значение, хранящееся в другом присоединенном свойстве...

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

Как указано в обновлении, для простых свойств это также справедливо.

Path = new PropertyPath(SomeClass.SomeAttachedProperty)

... что, по сути, эквивалентно этому...

Path = new PropertyPath("(0)",
    SomeClass.SomeAttachedProperty)
person Mark A. Donohoe    schedule 01.10.2015