【问题标题】:WPF DataGrid: How do you set the style of the first row only?WPF DataGrid:如何仅设置第一行的样式?
【发布时间】:2017-01-12 19:50:42
【问题描述】:

我已尝试寻找答案,但here 发布的问题尚未得到解答。

我尝试了一些复杂的 XAML,但从未奏效。如果选择了第一行,下面的代码会使 all 行变灰。无论选择哪个行索引,我都只需将第一行灰显。

<TextBlock.Style>
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="FontStyle" Value="Normal"/>
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=SelectedIndex, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}" Value="0"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Foreground" Value="Gray"/>
                <Setter Property="FontStyle" Value="Italic"/>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</TextBlock.Style>

有人可以帮忙吗?

谢谢。

【问题讨论】:

    标签: wpf xaml datagrid row selectedindex


    【解决方案1】:

    您可以使用所有ItemsControls 上的AlternationCount 属性(参考ListBox)。

    <DataGrid ItemsSource="{Binding Items}"
              AlternationCount="2147483647"
              ... 
              >
        <DataGrid.ItemContainerStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                        <Setter Property="Foreground" Value="Gray"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.ItemContainerStyle>
        ...
    </DataGrid>
    

    编辑

    <DataGrid ItemsSource="{Binding Items}"
              AlternationCount="2"
              VirtualizingStackPanel.IsVirtualizing="False">
              ... 
              >
        <DataGrid.ItemContainerStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="Gray"/>
                    </Trigger>
                    <DataTrigger
                        Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}"
                        Value="{x:Null}">
                        <Setter Property="Foreground" Value="Gray"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.ItemContainerStyle>
        ...
    </DataGrid>
    

    【讨论】:

    • 感谢您的建议。它可以工作,除了一个小问题:我需要 AlternationCount 等于 2(具有交替的白色和灰色行背景)。如果我将 AlternationCount 设置为此 Int.MaxValue 我会丢失背景颜色。有什么建议让这两个功能都工作吗?
    • 可以,但是需要IsVirtualizing="False",所以我更喜欢第一种方法。
    • 再次感谢您。我想我们真的很亲近。我会再给它一些时间看看结果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2011-12-18
    • 2011-06-18
    • 2012-03-13
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多