2010-12-10 5 views
1

Toute idée sur la façon dont je peux obtenir ce qui suit dans un .Net 4 DataGrid:contenu cellulaire Supprimer dans un DataGrid WPF lorsque la touche Supprimer est pressée

private void grid_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Delete) 
    { 
     DataGridCell cell = e.OriginalSource as DataGridCell; 

     if (cell == null) { return; } 

     if (!cell.IsReadOnly && cell.IsEnabled) 
     { 
      // Set the cell content (and the property of the object binded to it) 
      // to null 
     } 
    } 
} 

Ce comportement devrait fonctionner avec une cellule, donc je don ne veulent pas coder en dur les noms de colonne ou de propriété.

EDIT: Solution Je suis venu avec:

if (e.Key == Key.Delete) 
{ 
    DataGridCell cell = e.OriginalSource as DataGridCell; 

    if (cell == null) { return; } 

    if (!cell.IsReadOnly && cell.IsEnabled) 
    { 
      TextBlock tb = cell.Content as TextBlock; 

      if (tb != null) 
      { 
       Binding binding = BindingOperations.GetBinding(tb, TextBlock.TextProperty); 

       if (binding == null) { return; } 

       BindingExpression exp = BindingOperations.GetBindingExpression(tb, TextBlock.TextProperty); 

       PropertyInfo info = exp.DataItem.GetType().GetProperty(binding.Path.Path); 

       if (info == null) { return; } 

       info.SetValue(exp.DataItem, null, null); 
      } 
    } 
} 

Répondre

0

Cela pourrait être assez compliqué, selon le modèle de la cellule, etc.

J'imagine que vous auriez à utiliser divers BindingOperations méthodes (BindingOperations.GetBinding, BindingOperations.GetBindingExpression, etc) pour jouer avec la valeur liée?

3

Il a deux choses que je devais faire pour obtenir ce travail:

  1. Filtre à supprimer touches lors de l'édition (n'a pas pu trouver un moyen évident de détecter si en mode d'édition):

    private bool _isEditing = false; 
    private void datagrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) 
    { _isEditing = true; } 
    
    private void datagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { _isEditing = false; } 
    
  2. Gérer le message KeyUp (KeyDown un message a été traité par datagrid):

    private void dataGrid_KeyUp(object sender, KeyEventArgs e) 
    { 
        if (!_isEditing && e.Key == Key.Delete && Keyboard.Modifiers == ModifierKeys.None) 
        { 
         foreach (var cellInfo in dataGrid.SelectedCells) 
         { 
          var column = cellInfo.Column as DataGridBoundColumn; 
          if (column != null) 
          { 
           var binding = column.Binding as Binding; 
           if (binding != null) 
            BindingHelper.SetSource(cellInfo.Item, binding, null); 
          } 
         } 
        } 
    } 
    
  3. Utilisez une classe d'aide-cadre pour acheminer la valeur = null au modèle de vue sous-jacente

    public class BindingHelper: FrameworkElement 
    { 
        public static void SetSource(object source, Binding binding, object value) 
        { 
         var fe = new BindingHelper(); 
         var newBinding = new Binding(binding.Path.Path) 
         { 
          Mode = BindingMode.OneWayToSource, 
          Source = source, 
         }; 
         fe.SetBinding(ValueProperty, newBinding); 
         fe.Value = value; 
        } 
    
        #region Value Dependency Property 
        public object Value 
        { 
         get { return (object)GetValue(ValueProperty); } 
         set { SetValue(ValueProperty, value); } 
        } 
    
        public static readonly DependencyProperty ValueProperty = 
         DependencyProperty.Register("Value", typeof(object), typeof(BindingHelper)); 
        #endregion 
    } 
    
Questions connexes