WPF DataGridCell样式CurrentItem

时间:2015-09-26 10:16:49

标签: c# wpf datagrid

有没有办法在当前行/项目上触发样式? 如果只选择了一行,则

<Trigger Property="DataGridCell.IsSelected" Value="True">

有效,但如果选择了多行,那该怎么办呢?我只想设置属于当前项目的单元格/行标题。

1 个答案:

答案 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>

不要忘记,当您有多个触发器为真时,将采用列表中的最后一个触发器。这意味着,如果你在第一个例子中改变了触发器的顺序,你就不会看到从选择到聚焦单元格的任何差异。