WPF DataGridCell样式当前项
本文关键字:样式 DataGridCell WPF | 更新日期: 2023-09-27 18:14:49
是否有办法在当前行/项上触发样式?如果只选择一行,则
<Trigger Property="DataGridCell.IsSelected" Value="True">
可以工作,但是如果选择了不止一行呢?我只想样式的单元格/标题,属于当前项目。
与"单元格属于当前项目"我猜你的意思是当前聚焦行?有两种不同类型的"选择"。一种是它自己的选择(由IsSelected
属性表示),它表示DataGrid
的选择。这意味着,选中的每一行(如果不允许多个,则只选中一行)。第二个是聚焦的单元格或行(由IsFocused
属性指示),它不用于网格的数据行为,而是用于图形选择,或者,正如您所说的,"当前"行或单元格。
有几个属性可以使用:
<Style x:Key="cellstyle" TargetType="DataGridCell">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Blue"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
第一个更改每个选定的单元格(如果通过按住shift键选择它们)。第二个只更改"current"单元格。
如果您需要为"当前"单元格的整行执行此操作,您可以使用该行的IsKeyboardFocusWithin
属性:
<Style x:Key="rowstyle" TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Yellow" />
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="Purple" />
</Trigger>
</Style.Triggers>
</Style>
上面的例子演示了如何向整个行添加行为。注意,单元格背景总是在行背景的前面。如果你需要有两个,单元格和行背景(所以你不能使用透明的单元格背景),你需要使用MultiDataBinding
,在那里你排除相应的行状态。假设有一个条件需要该行的IsKeyboardFocusWithin
为假:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=IsKeyboardFocusWithin, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}}" Value="False"/>
<Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=Self}}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="Blue"/>
</MultiDataTrigger>
不要忘记,当您有多个为真触发器时,列表中的最后一个将被取走。这意味着,如果您在第一个示例中更改触发器的顺序,您将看不到从选中单元格到聚焦单元格的任何区别。