WPF Datagrid Checkbox bound to Nullable boolean column weirdness

Case :

I am currently bussy with a project where i move a lot of data , some of this data is contained in bit fields in my database and i represent this in the UI with a checkbox in a datagrid everything worked fine untill i had a lightbulb moment the app gets its data through a WCF service , so i thought if the bit field is false i could better send a  Nothing pointer ( NULL for sharpies ) as the XML would be a lot smaller ( a null is represented by not writing the tags in XML ) and thus my transfers should be faster so i changed the boolean fields in my Models to nullable booleans .

Problem :

After this change i noticed that my client  app was actually slower  ( huh ? )  , a quick look in the inmediate window showed the following message

“System.Windows.Data Error: 6 : ‘SystemConvertConverter’ converter failed to convert value ‘<null>’ (type ‘<null>’); fallback value will be used, if available. BindingExpression:Path=Stand; DataItem=’mErrorListing’ (HashCode=30844487); target element is ‘CheckBox’ (Name=”); target property is ‘IsChecked’ (type ‘Nullable`1’) InvalidCastException:’System.InvalidCastException: Null object cannot be converted to a value type at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider at MS.Internal.Data.SystemConvertConverter.Convert(Object o, Type type, Object parameter, CultureInfo culture)  at System.Windows.Data.BindingExpression.ConvertHelper(IValueConverter converter, Object value, Type targetType, Object parameter, CultureInfo culture)'”

At first glance and after some Googling / Binging 🙂   i thought this was because my checkbox did not have the IsThreeState=”True” field set   wich makes known to the WPF engine that we are dealing with a checkbox with three states True , False or NotSet  ( Nothing a.k. Null ) , however setting this did not change a thing it still worked fine as before however the above message was printed in my debugger and i had the idea that it was actually slower as before ( because of the  prints in the immediate window ofcourse as this slows the IDE  )

Solution :

I   Binged and Googled because there should be people outta there that have done this before , but nothing appeared of relevancy to my problem ,so i thought lets play with the binding behvaior

this is how it looked : <DataGridCheckBoxColumn x:Name=”Stnd” Binding=”{Binding Path=Stand}” Header=”Stnd” Width=”35″ IsThreeState=”True” /> so i enterd a ,  behind the last binding field value and looked at what intellisence presented to me as availlable properties to set at one moment i found the TargetNullValue property so i changed my line to  <DataGridCheckBoxColumn x:Name=”Stnd” Binding=”{Binding Path=Stand,TargetNullValue=”}” Header=”Stnd” Width=”35″ IsThreeState=”True” /> , and eureka this worked no more error lines in my immediate window and my prog flew in speed as never before.

However now i got exactly what i requested from WPF i got a conversion to Null and a setter to Indeterminated of the grids checkbox ( wich shows the checkbox square filled with a color instead of a selection marker )   hmm 😦 do i actually want to present that to my users ? , after some peer reviews the answer was a big no , then i thought if this property does what its name says it shoud not be a problem at all to change the behavior  so i ended up with this line  <DataGridCheckBoxColumn x:Name=”Stnd” Binding=”{Binding Path=Stand,TargetNullValue=’False’}” Header=”Stnd” Width=”35″ IsThreeState=”True” /> that gives the exact behavior of my requirment if the bit field is set to True it shows my checkbox selected , if the bit field has a nothing / null  pointer or a false it shows the checkbox deselected .

 

 

Advertisements

VB.Net and MVVM

 MVVM

Microsoft has revisited the original presentation Model by a proposition of Martin Fowler this revission named MVVM is the perfect aproach for WPF and Silverlight as it was specifically designed for them

If you built apps with the Windows Presentation Framework ( WPF ) , Silverlight or for Windows Phone 7 you should sure consider adopting the Model View ViewModel ( MVVM ) as this design pattern is specifically handy to deall with  XAML UI elements in a clear way .

History

In 1974 EWD (*) wrote a paper called “On the role of scientific thought” , this was the first document that discussed the concept of SoC “…The Seperation Of Concerns, [is] the only availlable technique for efective ordering of one`s thoughts , that i know of.”

In 1989 Chris Reade went a step further and described the tasks “1. describe what is to be computed 2. Organize the computation sequencing into small steps 3. Organize memory management during the computation”

Moving fast forward Martin fowler and Eric Evans started to discuss design patterns related to contextual design leading to the current concept of SoC soon there were patterns and concepts like Domain Driven Design , Unit of Work and manny other  approaches and UI patterns like MVC , MVP and MVVM .

Layers

MVVM forces you to divide application code into different Layers  and Tiers

Model:  the model refers to either  an object model that represents the real state content , or  the data access layer that represents that content

View: the view refers to all elements displayed by the GUI .

ViewModel: the ViewModel is a “Model of the View” meaning it is an abstraction of the View that also serves in data binding between the View and the Model.  The ViewModel exposes public properties, commands, and abstractions. The ViewModel has been likened to a conceptual state of the data as opposed to the real state of the data in the Model.

Controller: some references for MVVM also include a Controller layer

Book

Building Enterprise Applications with Windows Presentation Foundation and the MVVM Model View ViewModel Pattern by Raffaele Garofalo

Code

VB.Net Silverlight webcam example in MVVM

* ( EWD ) Edsger Wybe Dijkstra was one of the most influential members of computing science’s founding generation

His letters are published here http://www.cs.utexas.edu/users/EWD/ i can sure recomend you to read them especially EWD 1209 had a high impact on me  http://www.cs.utexas.edu/users/EWD/ewd12xx/EWD1209.PDF after reading remember that it was 1995 when he wrote this !