如何仅为一列的网格单元实现特殊行为?
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>
当然,还要更新其他模板列的样式。
我有下一个格子:
<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>
当然,还要更新其他模板列的样式。