понедельник, 6 июля 2009 г.

Binding can only be set on a DependencyProperty of a DependencyObject.

Если вы когда-нибудь получали сообщение об ошибке с текстом:

A 'Binding' cannot be set on the 'Geometry' property of type 'ConnectionByLine'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

То уже знаете, что решение проблемы элементарно до безобразия, хотя некоторые, такие как я, всё же упускают детали.
Чаще всего это возникает, когда название свойства (в примере - Geometry) не соответствует регистрируемому свойству: DependencyProperty.Register("Geometry", ...);

Обычно DependencyProperty имеет следующий вид:

public static readonly DependencyProperty GeometryProperty = DependencyProperty.Register("Geometry", typeof(PathGeometry), typeof(BaseShape));

public PathGeometry Geometry
{
get { return (PathGeometry)GetValue(GeometryProperty); }
set { SetValue(GeometryProperty, value); }
}

После этого можно производить привязку к данному свойству следующим образом в XAML-коде:

...
Label
Content="{Binding ElementName=MyLine, Path=Geometry}"
...

Но помните, если вы примените какое-нибудь послабление в именовании свойств, то получите ошибку с сообщением о том, что привязку можно производить только на зависимые свойства.
Читать дальше......