如何设置DataGrid的行背景,基于使用数据绑定的属性值

在我的XAML代码中,我想根据一个特定行中对象的值来设置每行的Background颜色。 我有一个zObservableCollection ,每个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>这是这个DataGridItemsSource和一个types为zSelectedItem

我可以将颜色绑定到SelectedItem ,但是这只会改变DataGrid一行。

我怎么能根据一个属性改变这行backgroundcolor?

使用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(); } }