by JBrooks
11. March 2013 12:41
I have an application where the administrator can edit a user’s roles.
I wanted to reuse this same grid to show the user what roles they have, but I didn’t want them to be able to change the data. There is a IsReadOnly property on each of the columns, but this still allows the user to change the checkboxes.
If I set the IsEnabled property on the datagrid to false, then the user can’t change the checkboxes but the datagrid looks washed out and hard to read.
So this is too washed out to go with. I realized that another way to disable CheckBoxes is from the style:
<sdk:DataGrid.Resources>
<Style TargetType="CheckBox">
<Setter Property="IsThreeState" Value="False" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</sdk:DataGrid.Resources>
I wanted to see if there was a way to programmatically add a setter to this and there was.
// find the CheckBox style resource.
var resource = dgAccounts.Resources.FirstOrDefault(x => x.Key == typeof(CheckBox));
if (resource.Key != null)
{
Style s = resource.Value as Style;
(s.Setters as SetterBaseCollection).Add(new
Setter(CheckBox.IsEnabledProperty, value));
}
In the code above, “value” can be true or false. This gives me a little better presentation:
But, hey, this is Silverlight – why am I using those dinky check boxes anyway. The better solution is to create a user control that acts like a checkbox and you can style it as big as you want.
And then the code to set the disable style just needs to change the type it is looking for on the 1 line:
var resource = dgAccounts.Resources.FirstOrDefault(x => x.Key == typeof(ucCheckBox));
Now, the disabled version is a lot more readable.