Применить фон строки на основе значений в определенном столбце (WPF DataGrid)

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

Я создал инструмент для базы данных, который показывает элементы с определенными параметрами фильтрации. Однако, прочитав еще немного о 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) . У кого-нибудь есть предложения, как это можно исправить?

Комментарии:

1. Вы уже проверили в режиме отладки, какое значение передается? Можете ли вы поделиться этим?

Ответ №1:

Проблема, или, во всяком случае, одна из них, заключается в вашей привязке. Когда вы делаете:

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

Он ищет элемент свойства в DataGridRow, у которого есть свойство YRNRO.

Более вероятно, что вы захотите привязаться к чему-то, что является datacontext datagridrow, что означает, что вы должны удалить привязку relativesource.

У вас есть коллекция чего-то, что является источником collectionviewsource. Каждая строка в datagrid получает что-то в виде datacontext.

В зависимости от того, что именно это такое, вы должны использовать:

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

Или, если что-то имеет свойство под названием Item, которое является сложным объектом с proprty YNRNO, тогда

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

Комментарии:

1. Спасибо вам за это! Вторая проблема заключалась в преобразователе «значение», который мне пришлось использовать if (value.ToString().Trim().StartsWith("7")) return Brushes.Blue; вместо того, что было раньше `