Today is a happy day….
I am actually battling with a Silverlight business application with some interesting design & behavior – in fact it is a migration from a VB6.0 App.. but the design of the screens is not bad and it’s pretty useful to the task they are designed for.
One of the most costly things I’ve suffered is that I had to show off some information grouped and totalized (nothing strange here, you just have to search a bit and you know the how-to) and also each group of information could have different format on the same column…. and oh my, this has been a real killer…
I tried to change it programmatically but the Binding is bound to the column… so I tried to change the binding, first through the StringFormat but… hey! it is not bindable! Bummer… then I tried to use a custom Converter and bind the ConverterParameter but it also happened not to be bindable – or I did not find how to implement it. I tried also to implement a custom Converter deriving from FrameworkElement and IConverter so I could create a bindable property for using it instead of the ConverterParameter…. but that didn’t work out properly…
Until I found a gem, the “Silverlight MultiBinding” solution that a smart guy, Colin Eberhardt conceived & developed to implement a similar binding model to that of WPF, with more funcitons and to be clear, more mature. Silverlight team, we need that on SL ASAP if we are to build serious SL business apps… if not some developers can get near to crazy to solve some “customer needs”… like I have ;).
Regarding the MultiBinding, you can read from Colin on his blog here: http://www.scottlogic.co.uk/blog/colin/2010/08/silverlight-multibinding-updated-adding-support-for-elementname-and-twoway-binding/
Gladly I’m not alone as “Full Databinding Support” is the top requested feature on the Silverlight Feature Suggestions forum here: http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions, with over three thousand points, it’s the Nº1!!.
Wich includes requests for fabulous features like:
+ ValueConverter ConvertParameter binding.
+ StringFormat binding.
+ Strongly typed DataBinding support (intellisense).
+ Conditional Binding.
+ Binding to dynamic objects .
+ More extensibility.
+ Etc..
Regarding to my solution I implemented it on the DataGridTemplateColumn for each column I needed to format conditionally, considering also that some columns will need to be editable, so I had to use the usual binding for the editable template even that the TwoWay binding works on the Multibinding implementation but I found no way to keep the format from being reset (by now the TwoWay multibinding requires that all the properties are TwoWay). You can see the XAML code next:
<data:DataGridTemplateColumn Header=”Budget” >
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock TextAlignment=”Right” >
<multibinding:BindingUtil.MultiBindings>
<multibinding:MultiBindings>
<multibinding:MultiBinding TargetProperty=”Text” Converter=”{StaticResource MultiBindingGenericConverter}” >
<multibinding:MultiBinding.Bindings>
<multibinding:BindingCollection>
<Binding Path=”Budget” />
<Binding Path=”Budget_Format” />
</multibinding:BindingCollection>
</multibinding:MultiBinding.Bindings>
</multibinding:MultiBinding>
</multibinding:MultiBindings>
</multibinding:BindingUtil.MultiBindings>
</TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox TextAlignment=”Right” Text=”{Binding Budget, Converter={StaticResource RoundedConverter}, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}” >
</TextBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate></data:DataGridTemplateColumn>
So if you have a similar scenario, I’d recommend Colin’s solution.
Other issue I had with the DataGrid was with the Virtualization – it’s virtually impossible to deactivate. Also the search for a solution on this was” a bit chaotic… “
I was lucky to find out this gem here http://forums.silverlight.net/forums/t/101075.aspx on which Xusan is telling us not to deactivate it but to change its structure and take out the component that provides the virtualization, changing its ControlTemplate.
That saved my day as the DataGrid really is not “Recycling” but “Reusing”, which I think should be changed or made optional. As this can be Ok for performance reasons but on others you can end up coding a huge clean-up function that will kill the performance of the virtualization… if there is a quick way of “cleaning” a row or cell, it would be great this was as fast as possible…
Well, will keep on finishing my DataGrid based project management Silverlight Bizz app 😉
Have fun!
Does a if statement in the datagrid loading row work?
LikeLike