根据DataGridTemplateColumn

时间:2015-04-25 00:00:32

标签: c# wpf checkbox datagrid

我有一个DataGrid,数据绑定到DataTable,列设置为自动生成。

第一列的布尔数据类型替换为DataGridTemplateColumn,其中包含来自DataTemplate的CheckBox。这一切都很好。

但是,现在我想在未选中CheckBox时将DataGridCell背景变为红色。

问题是,我不知道如何使用IsChecked触发器设置CheckBox的父DataGridCell样式。

WPF:

    <Window.Resources>
    <DataGridTemplateColumn x:Key="colSelect">   

        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <CheckBox Name="chkBxSelect" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"
                  IsChecked="{Binding Path=Select, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                  Click="chkBxSelect_Click">
                </CheckBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>

        <DataGridTemplateColumn.HeaderTemplate>
            <DataTemplate>
                <CheckBox x:Name="chkBxSelectAll" 
                    Content="Select" 
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center" 
                    IsThreeState="True" 
                    Click="chkBxSelectAll_Click"  
                    IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.SelectAll}">
                    </CheckBox>
            </DataTemplate>
        </DataGridTemplateColumn.HeaderTemplate>

        <DataGridTemplateColumn.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Foreground" Value="White"></Setter>
                        <Setter Property="Background" Value="DarkGray"></Setter>
                        <Setter Property="BorderBrush" Value="Red"></Setter>
                        <Setter Property="BorderThickness" Value="1"></Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGridTemplateColumn.CellStyle>
    </DataGridTemplateColumn>
</Window.Resources>

C#,而DataGrid列自动生成:

    DataGridTemplateColumn col = (DataGridTemplateColumn)Resources["colSelect"];
    e.Column = col;
    e.Column.IsReadOnly = false;

更新 到目前为止,我已经发现可以在Binding中使用RelativeSourceAncestorType来完成。但是,仍然试图让它发挥作用。

1 个答案:

答案 0 :(得分:1)

经过艰苦的努力,甚至没有尝试最明显的解决方案。我找到了。这是相对非常简单和容易的。

只需将DataTrigger添加到DataGridCell样式并完成所有操作,WPF就是魔术。

    <DataGridTemplateColumn.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter Property="Foreground" Value="White"></Setter>
                <Setter Property="Background" Value="DarkGray"></Setter>
                <Setter Property="BorderBrush" Value="Red"></Setter>
                <Setter Property="BorderThickness" Value="1"></Setter>
            </Trigger>
            <DataTrigger Binding="{Binding Path=Select, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="False">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGridTemplateColumn.CellStyle>