如何在代码隐藏的自定义DataGrid中的DataGridColumnHeader上附加事件?

时间:2014-11-15 05:58:24

标签: wpf datagrid custom-controls wpfdatagrid

我在Loaded事件上附加事件“DataGridColumnHeader_MouseRightButtonDown”以打开上下文菜单以显示列名。它工作正常。

 private void dtaGrd_Loaded(object sender, RoutedEventArgs e)
 {
   columnHeaders = TreeHelper.GetVisualChildCollection<DataGridColumnHeader>(this);
   foreach (DataGridColumnHeader columnHeader in columnHeaders)
   {
     columnHeader.MouseRightButtonDown += DataGridColumnHeader_MouseRightButtonDown;
   }
 }

但是当我取消选中列时,“名称”列的可见性将被折叠。再次,我检查了该列,将Visibility设置为“Visible”,然后“DataGridColumnHeader_MouseRightButtonDown”事件无效。

我的实施是错误的还是DataGridColumnHeader会在可见性发生变化时创建新实例?

是的,我发现当DataGridColumnHeader的visilbity被更改时,它的Loaded事件也会被触发。因此,我们必须在DataGridColumnHeader的加载事件上绑定处理程序。

我在Datagrid的哪个事件中知道DataGridColumnHeader已加载? 或者我必须附加DataGridColumnHeader Loaded Event?

1 个答案:

答案 0 :(得分:1)

首先,您应该知道每次更改任何控件的可见性时,都会执行“Loaded”事件。

在您的情况下,您通过从DataGrid的可视集合中查找,为数据网格的列标题提供处理程序。

因此,一旦您将Visibility列从Visible翻转到Collapsed,它就会从数据网格中卸载列,然后再次将其添加到Visible时,它会加载提供给标题的默认样式。

以下是主要问题,即绑定到列标题的处理程序将无法找到列Reset

我的意见是尝试自定义命令,或者在管理可见性时管理附加/分离处理程序。

谢谢:)