【问题标题】:Apply row background based on values in certain column (WPF DataGrid)根据特定列中的值应用行背景(WPF DataGrid)
【发布时间】:2020-09-06 12:37:19
【问题描述】:

我已经为数据库制作了一个工具,它可以显示具有某些过滤选项的项目。但是,在阅读了有关 WPF 和 C# 的更多信息之后。我使用这个https://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings 教程来修改我的应用程序来处理ItemCollectionViewSource

我正在尝试将某些背景应用于不同的行。我已经创建了类:

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;

namespace Liinos_inspector_FilterTest
{
    class LiinosIDToBackgroundConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is string)
            {
                string LiinosID = "";
                if (LiinosID.Trim().StartsWith("7")) return Brushes.Blue;
                if (LiinosID.Trim().StartsWith("6")) return Brushes.Yellow;
            }
            return Brushes.Red;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

    }
}

这是 XAML 部分:

    <DataGrid Margin="0,146,0,0" Background="{x:Null}" BorderBrush="{x:Null}"
              CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" IsReadOnly="True" 
              HorizontalGridLinesBrush="#FF377A6C" VerticalGridLinesBrush="#FF377A6C" 
          DataContext="{StaticResource ItemCollectionViewSource}"
          ItemsSource="{Binding}"
          AutoGenerateColumns="False" FontFamily="Arial Nova" Foreground="White" >
        <!--RowBackground="Transparent"-->

        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow" >
                <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Item.YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />
            </Style>
        </DataGrid.RowStyle>

这是列的 XAML:

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding YRNRO}">
                <DataGridTextColumn.Header>
                    <TextBlock Text="LIINOS ID" FontWeight="Bold" TextAlignment="Left"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding HAKUNIMI}">
                <DataGridTextColumn.Header>
                    <TextBlock Text="SEARCH NAME" FontWeight="Bold" TextAlignment="Left"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
        </DataGrid.Columns>

目前所有行都是红色的,因为看起来这不是真的if (value is string)。有人对如何解决这个问题有任何建议吗?

【问题讨论】:

  • 您是否已经在调试模式下检查过什么是值传递?可以分享一下吗?

标签: c# wpf xaml


【解决方案1】:

问题或其中之一是您的绑定。当你这样做时:

 Value="{Binding RelativeSource={RelativeSource Self}, Path=Item.YRNRO,

它正在 DataGridRow 上寻找具有 YRNRO 属性的属性 Item。

您更有可能希望绑定到 datagridrow 的数据上下文,这意味着您应该删除相对源绑定。

你有一个集合视图源。数据网格中的每一行都有一个数据上下文。

具体取决于你应该使用什么:

   <Setter Property="Background" Value="{Binding YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />

或者如果某物有一个名为 Item 的属性,它是一个带有属性 YNRNO 的复杂对象,那么

   <Setter Property="Background" Value="{Binding Item.YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />

【讨论】:

  • 谢谢你!第二个问题是在转换器“值”中,我必须使用 if (value.ToString().Trim().StartsWith("7")) return Brushes.Blue; 而不是之前的 `
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多