WPF Datagrid 基于值触发行颜色 [英] WPF Datagrid trigger row colour based on value

查看:20
本文介绍了WPF Datagrid 基于值触发行颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含数据网格的 WPF 应用程序.数据网格绑定到我的对象 OrderBlock,其中包含一个 Orders 类型的列表.

I have a WPF application that contains a datagrid. The datagrid is bound to my object OrderBlock which contains a List of type Orders.

<DataGrid DataContext="{Binding OrderBlock}"
              Name="dataGridOrdersGood" 
              ItemsSource="{Binding Orders}"

这很好用并且在我的数据网格中显示得很好.我的列表中有一个属性 (StatusGood),但我想显示为一个组合框,其中只能有两个值,发送"或保留".

This works fine and displays nicely in my datagrid. There is one property (StatusGood) in my List though that I would like to display as a combobox where there can be only two values, "Send" or "Hold".

如果组合框中的值为Hold",我希望该行变成不同的颜色.理想情况下使用从银色到黄色的线性渐变.我已经尝试了下面的代码 - 实际上只是暂时尝试将行变成红色,但没有任何反应.我看不出我下面的代码有什么问题.触发部分非常靠近下面代码的底部.我是 WPF 的新手,目前正在努力解决它.下面的代码主要来自一个非常好的帖子,可以在这里找到,http://www.codeproject.com/Articles/586132/WPF-DataGrid-Custommization-using-Style-and-Templa

If the value in the combobox is "Hold" I would like the row to turn different colour. Ideally using a linear gradient going from silver to yellow. I have tried the code below - literally just trying to turn the row red for the moment but nothing happens. I can't see what is wrong with my code below. The trigger part is very close to the bottom of the code below. I'm new to WPF and struggling with it at the moment. The code below has mainly come from a very good post that can be found here, http://www.codeproject.com/Articles/586132/WPF-DataGrid-Custommization-using-Style-and-Templa

    <!-- Data grid formatting Grid Row template -->
    <Style x:Key="DG_Row" TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="LightGreen"/>
        <Setter Property="Opacity" Value="1"/>
        <Setter Property="Padding" Value="3,2,2,3"/>
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>            
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Border x:Name="DGR_Border"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            SnapsToDevicePixels="True">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                <GradientStop Offset="0" Color="Transparent"/>
                                <GradientStop Offset="1" Color="Silver"/>
                            </LinearGradientBrush>                                
                        </Border.Background>
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <SelectiveScrollingGrid.RowDefinitions>
                                <RowDefinition Height="20" />
                                <RowDefinition Height="Auto" />
                            </SelectiveScrollingGrid.RowDefinitions>
                            <DataGridCellsPresenter Grid.Column="1"
                                ItemsPanel="{TemplateBinding ItemsPanel}"
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            <DataGridDetailsPresenter Grid.Row="1"
                                Grid.Column="1"
                                SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical},
                                  Converter={x:Static DataGrid.RowDetailsScrollingConverter},
                                  RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Visibility="{TemplateBinding DetailsVisibility}" />
                                                    <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                                                        Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row},
                                                                        Converter={x:Static DataGrid.HeadersVisibilityConverter},
                            RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </SelectiveScrollingGrid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="Normal_AlternatingRow">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" 
                                            Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#AAF0C570" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" 
                                            Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#AAFF7F00" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal_Selected">
                                    <Storyboard>
                                        <!-- ColorAnimation here same as Normal_AlternatingRow state -->
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <!-- ColorAnimation here same as Normal_AlternatingRow state -->
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Border>                        
                </ControlTemplate>
            </Setter.Value>
          <Style.Triggers>
              <DataTrigger Binding="{Binding Active}" Value="Hold">
                 <Setter Property="Background" Value="Red" />
             </DataTrigger>
        </Style.Triggers>
        </Setter>                
    </Style>

一如既往,任何帮助都会很棒.谢谢米

As always any help would be great. Thanks M

推荐答案

你是否需要改变 DataGridRow 的行为,或者改变样式就足够了?

Do you need to change the behaviour of the DataGridRow, or is it sufficient to alter the style?

如果您只需要根据属性更改行突出显示,您应该可以使用更简单的Style,如下所示:

If changing the row highlighting based on a property is all you need, you should be able to just use a simpler Style, something like this:

    <!-- A brush -->
    <LinearGradientBrush x:Key="BgBrush1" StartPoint="0,0" EndPoint="0,1">
        <GradientStop Offset="0" Color="#888888"/>
        <GradientStop Offset="1" Color="#FFFFF86E"/>
    </LinearGradientBrush>

    <!-- Your row style -->
    <Style x:Key="HighlightRow" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding StatusGood}" Value="Hold">
                <Setter Property="Background" Value="{StaticResource BgBrush1}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

您应该能够在 DataGrid 中需要时应用该样式,方法是将您的样式用作 RowStyle 属性的 StaticResource:

You should be able to apply the style when required in a DataGrid by using your style as a StaticResource for the RowStyle property:

<DataGrid DataContext="{Binding OrderBlock}"
          Name="dataGridOrdersGood" 
          ItemsSource="{Binding Orders}" 
          RowStyle="{StaticResource HighlightRow}" />

如果您想保留样式的其余部分并使用控件模板,您可以将 DataTrigger 放在您的 ControlTemplate.Triggers 中,您还必须提供 TargetName 属性,以指定您希望触发器作用的元素,因此使用我上面的画笔和您的初始代码:

If you want to retain the rest of your styling and use a control template, you can place your DataTrigger in your ControlTemplate.Triggers, you'll also have to supply a TargetName property, to specify the element you wish the trigger to act on, so using my above brush, and your initial code:

<!-- Data grid formatting Grid Row template -->
<Style x:Key="DG_Row" TargetType="{x:Type DataGridRow}">        
    <Setter Property="Template">            
        <Setter.Value>
        <!-- Your code -->
            <ControlTemplate TargetType="{x:Type DataGridRow}">
                <Border x:Name="DGR_Border"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        SnapsToDevicePixels="True">
                <!-- Your code -->
                </Border>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding StatusGood}" Value="Send">
                        <Setter TargetName="DGR_Border" Property="Background" Value="{StaticResource BgBrush1}"/>
                     </DataTrigger>
                 </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

其中 DGR_Border 是您使用现有渐变为边界指定的名称.

Where DGR_Border is the name you had given your border with the existing gradient.

这篇关于WPF Datagrid 基于值触发行颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆