En mi código XAML, quiero establecer el Background
color de cada fila, según un valor del objeto en una fila específica. Tengo una ObservableCollection
de z
, y cada z
una tiene una propiedad llamada State
. Empecé con algo como esto en mi DataGrid
:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background"
Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
</Style>
</DataGrid.RowStyle>
Este es un enfoque incorrecto porque x no es una propiedad en mi clase ViewModel.
En mi clase ViewModel tengo una ObservableCollection<z>
que es la ItemsSource
de esto DataGrid
y una SelectedItem
de tipo z
.
Podría vincular el color a SelectedItem
, pero esto solo cambiará una fila en el DataGrid
.
¿Cómo puedo, en función de una propiedad, cambiar este color de fondo de filas?
wpf
xaml
wpfdatagrid
Tobias Moe Thorstensen
fuente
fuente
'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')
es posible que no encuentre el Estado de la propiedad cuando mi entidad tiene esto y mi base de datos muestra el Estado como una columna?z.State
.enum
valor. Esta respuesta en StackOverflow me ayudó con eso.public
Lo mismo se puede hacer sin
DataTrigger
también:<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>
Dónde
BooleanToBrushConverter
está la siguiente clase: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(); } }
fuente
En XAML, agregue y defina una propiedad RowStyle para DataGrid con el objetivo de establecer el fondo de la fila en el color definido en mi objeto de empleado.
<DataGrid AutoGenerateColumns="False" ItemsSource="EmployeeList"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Background" Value="{Binding ColorSet}"/> </Style> </DataGrid.RowStyle>
Y en mi clase de empleado
De esta manera, cada fila del DataGrid tiene el color de fondo de la
ColorSet
propiedad de mi objeto .fuente