У нас есть наследуемое присоединенное свойство, в котором хранится объект. Дальше по визуальному дереву мы хотим привязать свойство к этому объекту из кода.
Обычно мы создаем часть пути привязки следующим образом...
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)
... который получает значение второго присоединенного свойства из объекта, хранящегося в первом присоединенном свойстве.