有没有办法在当前行/项目上触发样式? 如果只选择了一行,则
<Trigger Property="DataGridCell.IsSelected" Value="True">
有效,但如果选择了多行,那该怎么办呢?我只想设置属于当前项目的单元格/行标题。
答案 0 :(得分:1)
对于“属于当前项目的单元格”,我猜您的意思是当前关注的行?
有两种不同类型的“选择”。
一个是自我选择(由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键选择它们)。第二个只改变“当前”单元格。
如果您需要对“当前”单元格的整行执行此操作,则可以使用行的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>
不要忘记,当您有多个触发器为真时,将采用列表中的最后一个触发器。这意味着,如果你在第一个例子中改变了触发器的顺序,你就不会看到从选择到聚焦单元格的任何差异。