WPF DataGridCell样式当前项

本文关键字:样式 DataGridCell WPF | 更新日期: 2023-09-27 18:14:49

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

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

可以工作,但是如果选择了不止一行呢?我只想样式的单元格/标题,属于当前项目。

WPF DataGridCell样式当前项

与"单元格属于当前项目"我猜你的意思是当前聚焦行?有两种不同类型的"选择"。一种是它自己的选择(由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>

不要忘记,当您有多个为真触发器时,列表中的最后一个将被取走。这意味着,如果您在第一个示例中更改触发器的顺序,您将看不到从选中单元格到聚焦单元格的任何区别。