【问题标题】:WPF Datagrid trigger row colour based on valueWPF Datagrid根据值触发行颜色
【发布时间】:2013-09-05 23:58:49
【问题描述】:

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

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

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

如果组合框中的值为“保持”,我希望该行变成不同的颜色。理想情况下使用从银色到黄色的线性渐变。我已经尝试了下面的代码-实际上只是暂时尝试将行变为红色,但没有任何反应。我看不到下面的代码有什么问题。触发部分非常接近下面代码的底部。我是 WPF 的新手,目前正在努力解决它。下面的代码主要来自一个非常好的帖子,可以在这里找到,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>

一如既往,任何帮助都会很棒。 谢谢 M

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您需要更改DataGridRow 的行为,还是更改样式就足够了?

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

        <!-- 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

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

    编辑:

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

    <!-- 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 是您为现有渐变的边框指定的名称。

    【讨论】:

    • 嗨,克里斯,感谢您的回复。行改变颜色只是基于一个属性。你能告诉我哪些二传手隐藏了我的突出显示。它如何决定显示哪些颜色,隐藏哪些颜色?再次感谢!
    • 嗨,我表达的不是特别好,更多的是您定义的用于显示控件的ControlTemplate 没有定义您需要的设置器行为,我怀疑它没有'不包含与默认DataGridRow相同的元素,因此彩色背景被隐藏/不可用(我可能错了)。已编辑。
    • 对不起,我不太明白。那么我的 DataTrigger 应该放在我上面的代码中的什么位置呢?
    • &lt;ControlTemplate.Triggers&gt; 元素内,在&lt;ControlTemplate&gt; 元素内。因此,例如,我将其放在您现有的 &lt;Border&gt; 声明下方(稍微编辑答案以反映该更改)。
    • 我已将它移到我的 声明下方并放置 controltemplate.triggers 但仍然没有发生任何事情。不确定它是否被其他东西隐藏了
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2016-05-03
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多