W moim kodzie XAML chcę ustawić Background
kolor każdego wiersza na podstawie wartości obiektu w jednym określonym wierszu. Mam ObservableCollection
of z
, a każdy z nich z
ma właściwość o nazwie State
. Zacząłem od czegoś takiego w moim DataGrid
:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background"
Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
</Style>
</DataGrid.RowStyle>
Jest to niewłaściwe podejście, ponieważ x nie jest właściwością w mojej klasie ViewModel.
W mojej klasie ViewModel mam ObservableCollection<z>
który jest ItemsSource
tego DataGrid
i SelectedItem
typ z
.
Mógłbym związać kolor SelectedItem
, ale to zmieni tylko jeden wiersz w DataGrid
.
Jak mogę, w oparciu o jedną właściwość, zmienić te wiersze backgroundcolor?
wpf
xaml
wpfdatagrid
Tobias Moe Thorstensen
źródło
źródło
'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')
Dlaczego nie znajduje stanu właściwości, gdy moja jednostka to przechowuje, a moja baza danych pokazuje stan jako kolumnę?z.State
.enum
wartości. Ta odpowiedź na StackOverflow pomogła mi w tym.public
To samo można zrobić bez
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>
Gdzie
BooleanToBrushConverter
jest następująca klasa: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(); } }
źródło
W języku XAML dodaj i zdefiniuj właściwość RowStyle dla DataGrid, aby ustawić tło wiersza na kolor zdefiniowany w moim obiekcie pracownika.
<DataGrid AutoGenerateColumns="False" ItemsSource="EmployeeList"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Background" Value="{Binding ColorSet}"/> </Style> </DataGrid.RowStyle>
I w mojej klasie pracowniczej
W ten sposób każdy wiersz DataGrid ma kolor tła z
ColorSet
Własności mojego obiektu .źródło