DataGridColumn标题中的ComboBox - 如何区分列?

时间:2015-07-13 14:14:22

标签: c# wpf wpfdatagrid

我在ComboBox列的标题中有一个DataGrid。我想处理SelectionChanged的{​​{1}}事件,但我需要知道哪个控件(在哪个列的标题中)生成了该事件。在对列构造函数的调用中,控件通过分配给ComboBox的静态资源DataTemplate放入标头中。

我想使用列数据上下文在HeaderTemplate上设置一些标识数据,但我无法访问该上下文。我可以轻松访问ComboBox数据模型上下文,但它与所有DataGrid(列)的数据相同。

知道如何解决哪个列标题ComboBoxes生成了该事件?

1 个答案:

答案 0 :(得分:1)

“哪个列标题ComboBox生成了该事件?” (ComboBox)sender是生成事件的ComboBox的句柄。

如果您需要访问标题或包含该ComboBox的列,您可以使用VisualTreeHelper,如下所述:How can I find WPF controls by name or type?

根据您问题中的信息,该线索的答案可能就是您要找的内容(由John Myczek提供) - 根据您想要的类型提出Window

  

您可以使用VisualTreeHelper查找控件。以下是一种方法   使用VisualTreeHelper查找指定的父控件   类型。您可以使用VisualTreeHelper以其他方式查找控件   同样。

public static class UIHelper
{
   /// <summary>
   /// Finds a parent of a given item on the visual tree.
   /// </summary>
   /// <typeparam name="T">The type of the queried item.</typeparam>
   /// <param name="child">A direct or indirect child of the queried item.</param>
   /// <returns>The first parent item that matches the submitted type parameter. 
   /// If not matching item can be found, a null reference is being returned.</returns>
   public static T FindVisualParent<T>(DependencyObject child)
     where T : DependencyObject
   {
      // get parent item
      DependencyObject parentObject = VisualTreeHelper.GetParent(child);

      // we’ve reached the end of the tree
      if (parentObject == null) return null;

      // check if the parent matches the type we’re looking for
      T parent = parentObject as T;
      if (parent != null)
      {
         return parent;
      }
      else
      {
         // use recursion to proceed with next level
         return FindVisualParent<T>(parentObject);
      }
   }
}
     

这样称呼:

Window owner = UIHelper.FindVisualParent<Window>(myControl);