Как установить фон строки DataGrid на основе значения свойства с помощью Привязок данных


в моем коде XAML я хочу установить Background цвет каждой строки, основанный на значении объекта в одной конкретной строке. У меня есть ObservableCollection на z, и все z есть свойство под названием State. Я начал с чего-то вроде этого в моем DataGrid:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Background" 
                Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
     </Style>
</DataGrid.RowStyle>

это неправильный подход, потому что x не является свойством в моем классе ViewModel.

в моем классе ViewModel у меня есть ObservableCollection<z> что это ItemsSource этой DataGrid и SelectedItem of типа z.

я мог бы привязать цвет к SelectedItem, но это изменит только одну строку в DataGrid.

как я могу, основываясь на одном свойстве изменить эту строку backgroundcolor?

3 58

3 ответа:

использовать DataTrigger:

<DataGrid ItemsSource="{Binding YourItemsSource}">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow"> 
            <Style.Triggers>
                <DataTrigger Binding="{Binding State}" Value="State1">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding State}" Value="State2">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

то же самое можно сделать без DataTrigger тоже:

 <DataGrid.RowStyle>
     <Style TargetType="DataGridRow">
         <Setter Property="Background" >
             <Setter.Value>
                 <Binding Path="State" Converter="{StaticResource BooleanToBrushConverter}">
                     <Binding.ConverterParameter>
                         <x:Array Type="SolidColorBrush">
                             <SolidColorBrush Color="{StaticResource RedColor}"/>
                             <SolidColorBrush Color="{StaticResource TransparentColor}"/>
                         </x:Array>
                     </Binding.ConverterParameter>
                 </Binding>
             </Setter.Value>
         </Setter>
     </Style>
 </DataGrid.RowStyle>

здесь BooleanToBrushConverter - Это следующий класс:

public class BooleanToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Brushes.Transparent;

        Brush[] brushes = parameter as Brush[];
        if (brushes == null)
            return Brushes.Transparent;

        bool isTrue;
        bool.TryParse(value.ToString(), out isTrue);

        if (isTrue)
        {
            var brush =  (SolidColorBrush)brushes[0];
            return brush ?? Brushes.Transparent;
        }
        else
        {
            var brush = (SolidColorBrush)brushes[1];
            return brush ?? Brushes.Transparent;
        }
    }

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

несмотря на то, что этот вопрос старый, я думал, что опубликую свой способ решения этой проблемы, чтобы помочь другим в будущем.

в XAML добавьте и определите свойство RowStyle для DataGrid. Моей целью было установить фон строки до цвет, определенный в моем объекте сотрудника.

<DataGrid Name="mainDataGrid" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="EmployeeList">
       <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                 <Setter Property="Background" Value="{Binding ColorSet}"/>
            </Style>
</DataGrid.RowStyle>

и в моем классе сотрудников

public class Employee {

    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public string ColorSet { get; set; }

    public Employee() { }

    public Employee(int id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
        if (Age > 50)
        {
            ColorSet = "Green";
        }
        else if (Age > 100)
        {
            ColorSet = "Red";
        }
        else
        {
            ColorSet = "White";
        }
    }
}

таким образом, каждый строка DataGrid имеет фон Цвет на ColorSetсвойства моего объекта.

надеюсь, что это поможет всем.