2011-06-05 15 views
11

Necesito poder actualizar los valores de un conjunto de datos una vez que una celda pierde el foco de la edición. Sé cuándo la célula pierde el foco (CellEditEnding), pero el problema es que la actualización real de su elemento de contexto no se produce hasta que se produce el foco en esa fila. Esto se convierte en un gran problema cuando solo queda un elemento, ya que nunca puede perder el foco.WPF DataGrid CellEditEnding - DataSet no está actualizando Till Row Lost Focus

¿Cómo me aseguro de que cada vez que una columna de edición está completa (CellEditEnding), el contexto real de esa fila se actualiza en ese momento (no sólo cuando la fila pierde el foco)

Gracias de antemano!

+0

Como se trata de una aplicación de pantalla táctil, que fue capaz de aplicar esto establecer el foco en un elemento oculto cada vez que el mouse pasa sobre cualquier otro elemento (toque comenzó) ... ¡Sin embargo, se aprecia un enfoque menos hackish! –

Respuesta

9

Puede usar DataGrid.CommitEdit desde su controlador DataGrid.CellEditEnding, asegurándose de manejar la reentrada.

Aquí hay un artículo en el blog que describe la técnica:

+1

Esto no funciona para mí, puedo hacer clic en otros botones del programa y hacer lo que yo quiera (además de hacer clic en una fila diferente, presionar enter, tab o esc) y CellEditEnding nunca se activa.Esperaría que salir de DataGrid y hacer clic en otros objetos hiciera que la celda finalizara la edición actual. ¿Como hacer esto? – Alan

+1

incluso usando el código que mencionaste, la primera fila que comencé a editar, permaneció en EditMode, y no pude editar diferentes filas para editar. – itsho

7

me encontré con un problema similar, tengo una fila DataGrid que contiene 5 columnas. Los datos de las 5 columnas se actualizarán en origen solo después de que toda la fila de cuadrícula de datos haya perdido el foco.

Después de buscar, encontré una manera fácil de hacerlo. Eso es para agregar "UpdateSourceTrigger = LostFocus" en su enlace de datos en la celda.

Por ejemplo:

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <ComboBox DisplayMemberPath="Name" 
        ItemsSource="{Binding Path=MyDataSets}" 
        SelectedValue="{Binding Path=DataSelected, UpdateSourceTrigger=LostFocus}"/> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

Esto va a hacer el truco, así que cuando cada uno de los enfoque celular perdido, en lugar de toda la fila, los datos de la celda cuando actualizará la fuente de inmediato.

+0

también puede cambiarlo a: SelectedValue = "{Binding Path = DataSelected, UpdateSourceTrigger = PropertyChanged}" funciona para mí .. gracias :) –

0

Simplemente vaya a cualquier otro control de su cuadro de diálogo llamando [control]. Enfoque(). Haga esto dentro del evento OnClosing().

El LostFocus es el activador de actualización predeterminado para la celda de datos. Pero la ventana en sí misma y también el borde o título de la ventana (y allí el botón del sistema "X") no pueden enfocarse. Es por eso que la edición no es final.

0

Puede usar cualquier evento PreviewMouseMove de cualquier otro objeto. En mi caso, quiero que la cuadrícula de datos pierda el control antes de agregarle una nueva línea.

MainWindow.xaml.cs

private void MenuItem_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     Grid.CommitEdit(); 
    } 

MainWindow.xaml

<MenuItem Header="New Line" Command="{Binding CommandNewRow}" PreviewMouseMove="MenuItem_PreviewMouseMove"/> 

MainWindowViewModel.cs

public ICommand CommandNewRow 
    { 
     get 
     { 
      if (_commandNewRow == null) 
      { 
       _commandNewRow = new RelayCommand(p => CommandNewRowExecute(), p => CommandNewRowCanExecute()); 
      } 
      return _commandNewRow; 
     } 
    } 

    private void CommandNewRowExecute() 
    { 
     FileList.Add(new File("", "")); 
    } 

    private bool CommandNewRowCanExecute() 
    { 
     if (FileList.Count > 0) 
      return true; 
     return false; 
    }