如何仅为一列的网格单元实现特殊行为?

How to implement special behavior for grid cells only for one column?

我有下一个格子:

<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.Header>
                <TextBlock AutomationProperties.AutomationId="CustomerID1" />
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Blue"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="{x:Type l:Customer}">
                    <TextBlock Text="{Binding FirstName}"
                               AutomationProperties.AutomationId="FirstNameID" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.Header>
                <TextBlock AutomationProperties.AutomationId="CustomerID2" />
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="{x:Type l:Customer}">
                    <TextBlock Text="{Binding LastName}" AutomationProperties.AutomationId="LastNameID" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Red"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGridTemplateColumn.CellStyle>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <EventSetter Event="Unselected"
                         Handler="UnselectedHandler" />
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

我有一个特定的列,该列的所有单元格都有特定的样式:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.Header>
        <TextBlock AutomationProperties.AutomationId="CustomerID1" />
    </DataGridTemplateColumn.Header>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Blue"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGridTemplateColumn.CellStyle>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="{x:Type l:Customer}">
            <TextBlock Text="{Binding FirstName}" 
                       AutomationProperties.AutomationId="FirstNameID" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我还有网格中所有单元格的整体样式:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <EventSetter Event="Unselected"
                     Handler="ExpressionUnselectedHandler" />
    </Style>
</DataGrid.CellStyle>

但是UnselectedHandler不处理这个事件。

如何同时对所有单元格使用特定样式和默认样式?

您正在用 DataGridTemplateColumn.CellStyle 覆盖 DataGrid.CellStyle。

将 DataGrid.CellStyle 中的样式移动到 DataGrid.Resources:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <EventSetter Event="Unselected" Handler="UnselectedHandler" />
    </Style>
</DataGrid.Resources>

但它仍然无法正常工作,因为 DataGridTemplateColumn.CellStyle 仍在覆盖它,因此您需要添加样式:BasedOn="{StaticResource {x:Type DataGridCell}}"。这告诉它使用已经定义的样式(在 Grid.Resources 中),但向其中添加以下内容。

<DataGridTemplateColumn.CellStyle>
    <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Blue"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGridTemplateColumn.CellStyle>

当然,还要更新其他模板列的样式。