2010-12-10 135 views
1

我如何能實現在.NET 4的DataGrid以下任何想法:刪除單元格內容時刪除鍵被按下

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 
     } 
    } 
} 

這種行爲應該與任何細胞工作,所以我不不想硬編碼列或屬性名稱。

編輯:解決方案,我想出了:

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); 
      } 
    } 
} 

回答

0

這可能是相當複雜的,這取決於電池的模板等

我想像你不得不使用各種BindingOperations方法(BindingOperations.GetBindingBindingOperations.GetBindingExpression等)弄亂綁定值?

3

有幾件事情我必須做的就是這個工作:

  1. 編輯篩選出時刪除按鍵(找不到一個明顯的方式在編輯模式下,如果 檢測):

    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. 拉手的KEYUP消息(的KeyDown消息是由數據網格處理):

    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. 使用框架輔助類路由該值= null以底層視圖模型

    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 
    }