vendredi 24 avril 2015

Set DataGridCell style depending on CheckBox Checked state in DataGridTemplateColumn

I have a DataGrid with data binding to DataTable with columns set to auto generate.

The first column has boolean data type replaced with DataGridTemplateColumn with CheckBox from DataTemplate. It all works fine as it is.

However, now I want to make the DataGridCell background to red when the CheckBox is not checked.

The problem is, I have no idea how to set CheckBox's parent DataGridCell style with IsChecked trigger.

WPF:

<DataTemplate x:Key="IsSelectedColumnTemplate">
    <CheckBox Name="chkBxSelect" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Center"
              IsChecked="{Binding Path=Select, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              Click="chkBxSelect_Click">
    </CheckBox>
</DataTemplate>

C# while DataGrid Column AutoGenerating:

// Cell Style
Style cellStyle = new Style(typeof(DataGridCell));

// Triggers
Setter setterForeground = new Setter(DataGridCell.ForegroundProperty, Brushes.White);
Setter setterBackground = new Setter(DataGridCell.BackgroundProperty, Brushes.DarkGray);
Setter setterBorderBrush = new Setter(DataGridCell.BorderBrushProperty, Brushes.Red);
Setter setterBorderThickness = new Setter(DataGridCell.BorderThicknessProperty, new Thickness(1));

Trigger triggerIsSelected = new Trigger()
{
    Property = DataGridCell.IsSelectedProperty,
    Value = true,
    Setters = { setterForeground, setterBackground, setterBorderBrush, setterBorderThickness },
};

cellStyle.Triggers.Add(triggerIsSelected);
DataGridTemplateColumn col = new DataGridTemplateColumn();
DataTemplate chkBxDataTemplate = (DataTemplate)Resources["IsSelectedColumnTemplate"];
Binding bd = new Binding(e.PropertyName) {Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };
col.CellTemplate = chkBxDataTemplate;
col.Header = e.Column.Header;
col.SortMemberPath = e.Column.SortMemberPath;
col.CellStyle = cellStyle;
e.Column = col;
e.Column.IsReadOnly = false;




Aucun commentaire:

Enregistrer un commentaire