Как установить фон строки 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 ответа:
использовать
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
свойства моего объекта.надеюсь, что это поможет всем.