2

我正在尝试使用 XAML 为奇数行设置不同的颜色。

有问题的数据网格有 3 种不同类型的数据,我想用不同的颜色着色,而简单地更改 AlternatingRowBackground 是行不通的。

我打算使用类似的东西

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
         <Condition Binding="{Binding Type}" Value="0"/>                         
         <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/> 
         <Condition Binding="{Binding IsOddRow, RelativeSource={RelativeSource Self}}" Value="False"/>
    </MultiDataTrigger.Conditions>      
    <Setter Property="Background" Value="#FFDFE6ED"/>                   
</MultiDataTrigger>

似乎没有这样的属性IsOddRow。我应该检查什么属性?

4

3 回答 3

4

您可以设置AlternationCountDataGrid然后绑定到祖先的DataGridRows附加属性ItemsControl.AlternationIndex。如果值为“1”,则您有一个奇数行号。

<DataGrid ItemsSource="{Binding ...}"
          AlternationCount="2">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Type}" Value="0"/>
                        <Condition Binding="{Binding RelativeSource={RelativeSource Self},
                                                     Path=IsSelected}"
                                   Value="False"/>
                        <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
                                                     Path=(ItemsControl.AlternationIndex)}"
                                   Value="1"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Background" Value="#FFDFE6ED"/>
                </MultiDataTrigger>
                <!-- ... -->
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!-- ... -->
</DataGrid>

请注意,当绑定到附加属性时,您必须在附加属性周围加上括号。Path=(ItemsControl.AlternationIndex)会工作,但Path=ItemsControl.AlternationIndex不会。


更新您还可以通过附加行为
创建属性。IsOddRow在您订阅的行为中LoadingRow。在事件处理程序中,您获取已加载行的索引并检查它是否为奇数。然后将结果存储在一个名为的附加属性IsOddRow中,您可以绑定到该属性。

要开始行为,请添加behaviors:DataGridBehavior.ObserveOddRow="True"DataGrid

<DataGrid ItemsSource="{Binding ...}"
          behaviors:DataGridBehavior.ObserveOddRow="True">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Type}" Value="0"/>
                        <Condition Binding="{Binding Path=IsSelected,
                                                     RelativeSource={RelativeSource Self}}" Value="False"/>
                        <Condition Binding="{Binding Path=(behaviors:DataGridBehavior.IsOddRow),
                                                     RelativeSource={RelativeSource Self}}" Value="False"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Background" Value="#FFDFE6ED"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

数据网格行为

public class DataGridBehavior
{
    #region ObserveOddRow

    public static readonly DependencyProperty ObserveOddRowProperty =
        DependencyProperty.RegisterAttached("ObserveOddRow",
                                            typeof(bool),
                                            typeof(DataGridBehavior),
                                            new UIPropertyMetadata(false, OnObserveOddRowChanged));
    [AttachedPropertyBrowsableForType(typeof(DataGrid))]
    public static bool GetObserveOddRow(DataGrid dataGrid)
    {
        return (bool)dataGrid.GetValue(ObserveOddRowProperty);
    }
    public static void SetObserveOddRow(DataGrid dataGrid, bool value)
    {
        dataGrid.SetValue(ObserveOddRowProperty, value);
    }

    private static void OnObserveOddRowChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        DataGrid dataGrid = target as DataGrid;
        dataGrid.LoadingRow += (object sender, DataGridRowEventArgs e2) =>
        {
            DataGridRow dataGridRow = e2.Row;
            bool isOddRow = dataGridRow.GetIndex() % 2 != 0;
            SetIsOddRow(dataGridRow, isOddRow);
        };
    }

    #endregion // ObserveOddRow

    #region IsOddRow

    public static DependencyProperty IsOddRowProperty =
        DependencyProperty.RegisterAttached("IsOddRow",
                                            typeof(bool),
                                            typeof(DataGridBehavior),
                                            new PropertyMetadata(false));
    [AttachedPropertyBrowsableForType(typeof(DataGridRow))]
    public static bool GetIsOddRow(DataGridRow dataGridCell)
    {
        return (bool)dataGridCell.GetValue(IsOddRowProperty);
    }
    public static void SetIsOddRow(DataGridRow dataGridCell, bool value)
    {
        dataGridCell.SetValue(IsOddRowProperty, value);
    }

    #endregion // IsOddRow
}
于 2012-06-10T12:24:08.393 回答
2

我不确定您使用的是哪种网格/行类型,所以我不能给您确切的属性名称,但是,绑定到行的索引(行号)并使用值转换器(返回 true)来检查是否行是奇数或偶数。

于 2012-06-10T12:18:50.627 回答
0

几乎每个答案都使用AlternationCount="2",但我发现它有点太局限了。在我这边,我使用类似的东西AlternationCount="{ Binding MainData.ProjColl.Count}"来对我的行进行编号直到结束(注意它从 0 开始!)。

在这种情况下,我需要@Danny Varod 提到的值转换器。

我使用转换器来交替行的颜色(几乎回答了这个问题)

public class IsEvenConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        bool res = false;
        int? val = value as int?;
        if (null != val)
            res = (0 == (val % 2));
        return res;
    }     
    ...
}

和调用 XAML

<UserControl ...
<UserControl.Resources>
    ...
    <vm_nmspc:IsEvenConverter x:Key="IsEven"/>
    <Style TargetType="DataGridRow">
        <Setter Property="Width" Value="Auto"/>
        <Setter Property="Background" Value="LightGray"/>

        <!--Converter will be used below-->

        <Style.Triggers>
            ...
            <Setter Property="Background" Value="LightGray"/
            <DataTrigger Binding="{Binding  RelativeSource={RelativeSource Self},
                                            Path=(ItemsControl.AlternationIndex),
                                            Converter={StaticResource ResourceKey=IsEven}}" Value="true">
                <Setter Property="Background" Value="Lavender"/>
            </DataTrigger>
            <Trigger Property="IsMouseOver" Value="True" >
                <Setter Property="Background" Value="LightGreen"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

<Grid>
    <DataGrid ItemsSource="{Binding MainData.ProjColl}" AutoGenerateColumns="False" 
    AlternationCount="{ Binding MainData.ProjColl.Count}" >
    ...
    <DataGridTextColumn Header="Project Name" .... 

    </DataGrid>
</Grid>
</UserControl>

和一些离散的截图

在此处输入图像描述 在此处输入图像描述

同一代码的另一部分: 在 WPF DataGrid 上显示行号的简单方法

于 2017-02-22T15:29:12.227 回答