I like “convention over configuration/over-specification” approach very much. Caliburn is a briliant framework for building UI layer for Silverlight/WPF/WP7 apps with IoC,DI, extensibility, configurability, etc. using convetions.
We work on a proof of concept how we could (I will use it on my new project) use it. I publish the complete project later. But what I want to decribe here is that Caliburn supports the convetion style with the default property binding and how it would be good to extend it.
Let’s say I have a view model with the property Item which has the properties Title and Description.
So the final result I’d like to achieve is:
So XAML for that above result with the default element convention is:
Hm, I’m mixing convention and explicit style of definition. That’s not very good, I think. If I argue that Convetions are perfect I would like to use them in more than default situations.
Caliburn supports extensible model of conventions in this way (I write it in BDD style, it’s just for inspiration):
As a developer I want to extend the default property convetions for new controls so That I'll be able to use that convetion for new controls.
A possible solution could be:
as a developer I want to extend the ANY! property convetions for ANY! controls so that I'll be able to use that convetions in UI layer.
So then I would write in XAML the following:
To support this I had to extend Caliburn convetion model:
- IElementConvention has new property
This will enable to specify both: bindable property(target – where the data will be bound) and identification property (source – specifies what property contains the source data property name)
- DefaultElementConvetion which implements IElementConvetion
- DefaultConvetionManager which enables to specify both convention-required properties. Example for Textblock control:
The fist definition code adds the default convention with “Name” as the identification property and “Text” as the bindable property.
The second definition code adds the additional convention for Tooltip where bindable and identification properties are same.
- method TryCreateApplication – a place where the convetion is tranformed into so called applicable binding and where the value in Identification property is taken as a source for determining the path to bind in the XAML binding.
I’m going to post it to the author of Caliburn if that would be a feature suitable for the framework. I think it culd be because it would enable to extend the default element bindings not only for Name properties but for any such property.
That’s all for now ;o)