In meinem XAML-Code möchte ich die Background
Farbe jeder Zeile basierend auf einem Wert des Objekts in einer bestimmten Zeile festlegen . Ich habe eine ObservableCollection
von z
, und jede von z
hat eine Eigenschaft namens State
. Ich begann mit so etwas in meinem DataGrid
:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background"
Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
</Style>
</DataGrid.RowStyle>
Dies ist ein falscher Ansatz, da x keine Eigenschaft in meiner ViewModel-Klasse ist.
In meiner Klasse Viewmodel habe ich eine , ObservableCollection<z>
die das ist ItemsSource
dieser DataGrid
, und ein SelectedItem
Typ z
.
Ich könnte die Farbe binden SelectedItem
, aber dies ändert nur eine Zeile in der DataGrid
.
Wie kann ich basierend auf einer Eigenschaft die Hintergrundfarbe dieser Zeilen ändern?
wpf
xaml
wpfdatagrid
Tobias Moe Thorstensen
quelle
quelle
'State' property not found on 'object' ''z' (HashCode=7162954)'. BindingExpression:Path=State; DataItem='z' (HashCode=7162954); target element is 'DataGridRow' (Name=''); target property is 'NoTarget' (type 'Object')
Wie kommt es, dass der Eigenschaftsstatus nicht gefunden wird, wenn meine Entität dies enthält und meine Datenbank den Status als Spalte anzeigt?z.State
.enum
Wert ändern . Diese Antwort auf StackOverflow hat mir dabei geholfen.public
Das gleiche kann auch ohne gemacht
DataTrigger
werden:<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>
Wo
BooleanToBrushConverter
ist die folgende Klasse: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(); } }
quelle
Fügen Sie in XAML eine RowStyle-Eigenschaft für das DataGrid hinzu und definieren Sie sie mit dem Ziel, den Hintergrund der Zeile auf die in meinem Mitarbeiterobjekt definierte Farbe festzulegen.
<DataGrid AutoGenerateColumns="False" ItemsSource="EmployeeList"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Background" Value="{Binding ColorSet}"/> </Style> </DataGrid.RowStyle>
Und in meiner Mitarbeiterklasse
Auf diese Weise hat jede Zeile des DataGrid die Hintergrundfarbe der
ColorSet
Eigenschaft meines Objekts .quelle