views:

2886

answers:

5

Following my earlier post I am now trying now to bind the visibility of DataGridColumns to a VM notification property. MSDN suggests I should be able to do this with ease.

I already have a value convertor and VM notification property that I know works (I have tested these on another element on my page:

<CheckBox x:Name="chkAllTeams" Visibility="{Binding Converter={StaticResource BoolToVisibilityConverter}, Path=AllTeams}"/>

This checkbox control visibility reacts as I would expect. When I set the same binding on the DataTextColumn I get an AG_E_BAD_PARSER error on the Visibility= line of XAML:

<data:DataGridTextColumn 
Visibility="{Binding Converter={StaticResource BoolToVisibilityConverter}, Path=AllTeams}"
/>

Any ideas anyone? Thanks, Mark

A: 

Did you set BoolToVisibilityConverter as a resource?

vidalsasoon
Yep. Previous example on the checkbox proves that.
Mark Cooper
actually your example only shows half the code... anyway, as others have said that might not be your problem. <Grid.Resources> <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" /> </Grid.Resources>
vidalsasoon
+4  A: 

Visibility on the DataGridTextColumn is a different beast on the checkbox. Basically, it isn't a dependency property and can't be data-bound. If you need this functionality, you can subclass DataGridTextColumn and add your own dependency property to get the behavior.

  • Rectangle gets its Visibility property from UIElement and is a dependency property
  • DataGridTextColumn gets its Visibility from DataGridColumn and isn't a dependency property.
Erik Mork
Ah this is what I expected :-( Is that an easy task to subclass the DataGridTextColumn? Do you know of any online example for that? Mark
Mark Cooper
I don't know of any particular examples for DataGridTextColumn. The general approach would be to subclass, add a new dependency property for visibility and then use the new subclass in the Datagrid.Columns . Jesse has a good explanation of dependency properties: http://silverlight.net/blogs/jesseliberty/archive/2008/09/30/dependency-property-system-deeper-dive-part-1.aspx
Erik Mork
A: 

You'll need to use a datatemplate:

<DataTemplate x:Key="cBDT">
<(UIELEMENT HERE) x:Name="chkAllTeams" Visibility="{Binding Converter={StaticResource BoolToVisibilityConverter}, Path=AllTeams}"/> </DataTemplate>

As was mentioned before, only UIElement has the "Visibility" dependency property.

To see an example of this in context:

http://blogs.msdn.com/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

Jason Watts
Not a good answer - this hides the *element* in the column, not the *column* itself.
slugster
A: 

Hi,

Does anyone have a final solution for this issue now? I have tried using the DataTemplate approach above, it did hide the column name and content, but a blank column is still shown. I'd like to remove the column if the Visibility is set to Collapsed.

Thanks in advance!

Sissy Zhang
A: 

I've added an answer to a similar question: Silverlight: How to bind DataGridColumn.Visibility?

Stecy