2011-02-17 16 views
18

Soy nuevo en WPF y lo uso para construir un sistema de punto de venta.WPF actualización de fuente de DataGrid en la celda modificada

que tienen un control DataGrid en la ventana principal unido a un ObservableCollection de Item, el cajero ingresará/escanear los artículos que se venden la cantidad predeterminada para cada artículo es 1 pero está disponible por el cajero para cambiar la cantidad a mano.

Cada vez que cambio la cantidad, debe actualizar el precio total con la suma de los precios de los artículos cuando dejo la celda a otra celda en la fila, pero no sucede, la fuente se actualiza solo cuando ir a otra fila, no a otra celda en la misma fila.

¿Hay alguna forma de forzar el DataGrid para actualizar la fuente cuando se cambia la celda en lugar de la fila?

Respuesta

3

Sí, esto es posible. Su pregunta es básicamente el mismo que DataGrid - change edit behaviour

El código siguiente es sobre todo a partir de la respuesta de Quartermeister pero añade un BoundCellLevel DependencyProperty que se puede establecer cuando se necesita una unión DataGrid ser actualizados cuando cambia la celda actual.

public class DataGridEx : DataGrid 
{ 
    public DataGridEx() 
    { 

    } 

    public bool BoundCellLevel 
    { 
     get { return (bool)GetValue(BoundCellLevelProperty); } 
     set { SetValue(BoundCellLevelProperty, value); } 
    } 

    public static readonly DependencyProperty BoundCellLevelProperty = 
     DependencyProperty.Register("BoundCellLevel", typeof(bool), typeof(DataGridEx), new UIPropertyMetadata(false)); 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     var desiredSize = base.MeasureOverride(availableSize); 
     if (BoundCellLevel) 
      ClearBindingGroup(); 
     return desiredSize; 
    } 

    private void ClearBindingGroup() 
    { 
     // Clear ItemBindingGroup so it isn't applied to new rows 
     ItemBindingGroup = null; 
     // Clear BindingGroup on already created rows 
     foreach (var item in Items) 
     { 
      var row = ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; 
      row.BindingGroup = null; 
     } 
    } 
} 
9

El código en la respuesta aceptada no funcionó para mí desde las filas obtenidas a partir de los resultados en ItemContainerGenerator.ContainerFromItem(item) nula y el bucle sea bastante lento.

Una solución más sencilla a la pregunta es el código proporcionado aquí: http://codefluff.blogspot.de/2010/05/commiting-bound-cell-changes.html

private bool isManualEditCommit; 
private void HandleMainDataGridCellEditEnding(
    object sender, DataGridCellEditEndingEventArgs e) 
{ 
if (!isManualEditCommit) 
{ 
    isManualEditCommit = true; 
    DataGrid grid = (DataGrid)sender; 
    grid.CommitEdit(DataGridEditingUnit.Row, true); 
    isManualEditCommit = false; 
} 
} 
49

Aplicar la UpdateSourceTrigger=LostFocus a cada unión. Funcionó como un encanto para mí.

<DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 
+0

+1 Mejor solución del problema indicado. Los valores de otras celdas deben actualizarse tan pronto como se pierda el foco en la celda en lugar de perder el foco en la fila (valor predeterminado). – retanik

+1

¡Exactamente lo que necesitaba! ¡Gracias! – BrianVPS

+0

¡genial! te merecías ese voto positivo. –

1

Almund tiene razón. UpdateSourceTrigger=LostFocus funcionará mejor en su caso. Y como mencionó que su fuente se está actualizando cuando pasa a la siguiente fila, supongo que está utilizando ObservableCollection<T> para enlazar el DataGrid de . Porque eso es lo que necesitas para lograr lo que quieres.

<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, 
        Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 
<DataGridTextColumn Header="Total Price" Binding="{Binding TotalPrice, 
        Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 

Debe agregar "UpdateSourceTrigger=LostFocus" a cada una de sus columnas.

Cuestiones relacionadas