#98 – How Attached Properties Work in WPF
October 18, 2010 3 Comments
Attached properties in XAML allow attaching a property value to an object that is of a different type than the type where the property is defined. (E.g. Grid.Row property can be set for a Button).
When the XAML parser encounters an attached property, it calls a static method on the class where the property is defined. So setting a value for Grid.Row on a Button is equivalent to:
Grid.SetRow(myButton, 1);
In WPF, attached properties are often implemented using dependency properties. The object on which the property is being set (e.g. Button) inherits from DependencyObject, which means that it can store a collection of dependency properties.
When dependency properties are used for storing the values of attached properties, the static setter method in turn just calls the SetValue method on the object passed in to it. So the method listed above would be implemented as:
myButton.SetValue(Grid.RowProperty, 1);
Sean-
DependencyProperties are a WPF concept, not a XAML concept.
XAML’s attached properties are only based on the static setter and getter methods. Storage is up to the implementation of those methods.
Many use DependencyProperties. In .NET 4, non WPF uses can also use AttachablePropertyServices.
Saving object graphs to XAML via XamlWriter.Save or XamlServices.Save does require that the attached property be backed by a dependencyproperty (when using XamlWriter.Save) or AttachablePropertyServices (when using XamlServices.Save).
Thanks, Rob
Thanks Rob, I was a little muddy on the implementation of attached properties, not realizing that they aren’t always persisted using dependency properties. Your explanation helps. I updated the post, hopefully a bit more accurate now and possibly a bit more clear. (Also trying to stay withing 150 words, which is sort of my arbitrarily imposed “bite-sized chunk” limit).
Thanks again for the comments and explanation–I very much appreciate it.
Sean
Pingback: Day #1: Introduction to XAML Part II | Thirty Days of WPF