selecteditems personalizar examples ejemplo columns c# wpf xaml datagrid

c# - personalizar - WPF DataGrid actualiza el estilo de la celda después de la edición



selecteditems datagrid c# (1)

En XAML tengo una columna en un DataGrid que se define así:

<DataGridTextColumn Header="Name" Binding="{Binding Name}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" > <Setter Property="Background" Value="{Binding Converter={StaticResource NameToBrushConverter}}"/> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn>

NameToBrushConverter devuelve un color cuando la columna "Nombre" y la columna "Nombre" tienen el mismo contenido. De lo contrario, devuelve DependencyProperty.UnsetValue.

El problema que estoy enfrentando es que si edito una celda y finalizo la edición, el estilo no se actualiza. Solo si el valor recién ingresado se mueve a una línea diferente (debido a la clasificación) se aplica el color condicional del fondo. Pero si después de editar el objeto se muestra en la misma fila de la cuadrícula de datos, el color de fondo no se actualizará hasta que haga clic en ordenar. Tan pronto como la celda se mueve a una fila diferente, el fondo se actualizará de acuerdo con el valor del Convertidor.

Implementar INotifyPropertyChanged para el objeto no ayuda.

¿Hay alguna manera de decirle a GridView que debe reevaluar el estilo después de editar una celda?

dataGrid.Items.Refresh();

La actualización de llamadas ayuda, pero ¿cuál es el evento correcto para activar una actualización? Lo probé en CellEditEnding pero recibí una excepción "Actualizar no está permitido en las transacciones AddNew- o EditItem".


1) Debe establecer UpdateSourceTrigger en PropertyChanged porque está configurado de forma predeterminada en LostFocus dentro de un DataGrid.

2) Supongo que no tienes una CellEditTemplate.

3) Este es el mayor problema de todos . Tendría que usar la multiburación en sus propiedades con un convertidor relevante. La única razón por la que esto está funcionando ahora es porque cuando se pierde el enfoque, se produce el enlace en la actualización actual de la celda y obtiene su elemento (es decir, vinculante o vinculante a Path =.) Pasándolo al convertidor y generando algún color.

EDITAR:

Sé que veo que puse UpdateSourceTrigger en el enlace incorrecto. Colócalo en el Nombre de arriba y en tu estilo de celda también se unen a Nombre.

XAML:

<DataGrid> <DataGrid.Columns> <DataGridTextColumn Header="Name" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" > <Setter Property="Background" Value="{Binding Name ,Converter={StaticResource NameToBrushConverter}}"/> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>

Además, en cuanto a su pregunta a continuación. La única razón por la que funcionaba parcialmente al pasar de una fila a otra es debido a UpdateSourceTrigger predeterminado para cada enlace anidado en una DataGrid. que es LostFocus.

Cuando se vincula al DataContext actual usando

<SomeElement Tag={Binding} /> Or <SomeElement Tag={Binding Path=.} />

No estás vinculando a una propiedad.

La vinculación se evalúa cuando:

1) DependencyObject se inicializa y se evalúan todos sus DP. Obtiene su valor por primera vez.

2) UpdateSourceTrigger = LostFocus (El predeterminado dentro de DataGrid) se produce en LostFocus. Esta es la razón por la cual su Enlace se evalúa cuando pasa entre filas.

3) UpdateSourceTrigger = PropertyChanged. Si no lo quiere en su contexto de datos, debería establecer explícitamente una propiedad que se devolvería y llamaría cuando cambie la propiedad del nombre.

Algo como esto :

CS:

public class Entity : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { _name = value; PropertyChanged(this, new PropertyChangedEventArgs("Name")); PropertyChanged(this, new PropertyChangedEventArgs("Self")); } } private string _firstName; public string FirstName { get { return _firstName; } set { _firstName = value; PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); PropertyChanged(this, new PropertyChangedEventArgs("Self")); } } public Entity Self { get { return this; } } public event PropertyChangedEventHandler PropertyChanged = delegate { }; }

XAML:

<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" > <Setter Property="Background" Value="{Binding Self,Converter={StaticResource NameToBrushConverter}}"/> </Style>

Pero esto no se evaluará en LostFocus, pero no lo necesitaría de ninguna manera ya que evaluará la primera vez y luego en cualquier cambio de nombre.