Personally it seems like a bad idea to rely on an implementation that differs based on how you access it (e.g. using the DP or the wrapper). I think the better thing would be for the WPF framework to expose its internal DefaultValueFactory so you could initialize the value for each instance and in this case extend that infrastructure to allow it to be used to provide the default value for a readonly dependency property. Putting aside the fact that the documentation indicates you shouldn't rely upon them calling the wrapper, the fact that the designer isn't setup to handle this would make me hesitant to use this in a production environment.
Thanks. Thats good to know but it still would be better if WPF exposed the DefaultValueFactory so you don't have to worry about how the property will be accessed. There are things like this, inheritance context control, ancestor change notifications, etc. that intrinsic WPF elements and controls use internally that should really be exposed as public/protected members. The Silverlight controls are implemented in a separate assembly so there is less likelihood for this happening (assuming you don't start using InternalsVisibleTo). It would be nice if the WPF controls were implemented in this way too (doesn't mean they have to be released in this fashion) so you can see just what developers need when developing their own elements and controls.
BTW, in Bill's implementation he registered a property with a different name than the Get/Set accessor methods and from his blog this seems to be required for this approach to work. Another subtle issue with this is that a DependencyPropertyDescriptor will not be created for this. So in his sample his property will not be returned in the TypeDescriptor.GetProperties. However if you change the sample so that it registers it with the proper name - "Instance" - then it will be returned. Is this another bug?
Thanks,
Andrew
The ListView is a perfect example. The GridViewColumn (and even the ViewBase) is a DependencyObject but in order to support ElementName and DataContext bindings, it has an inheritance context. We have cases where we have "subobjects" that should support binding but don't make sense to be freezables or contentelements just to support this type of binding. If the ListView were developed outside the PresentationFramework assembly, it would have been more apparant that this type of functionality needs to be externalized. :-)