DataGridColumn标题中的组合框-如何区分列

本文关键字:何区 标题 组合 DataGridColumn | 更新日期: 2023-09-27 18:02:22

我在DataGrid列的标题中有一个ComboBox。我想处理ComboBoxSelectionChanged事件,但我需要知道哪个控件(在哪个列的标题中)生成该事件。控件通过在调用列构造函数时将静态资源DataTemplate分配给HeaderTemplate放在标题中。

我想使用列数据上下文在ComboBox上设置一些标识数据,但我无法访问该上下文。我可以很容易地访问DataGrid数据模型上下文,但所有ComboBoxes(列)的数据都是相同的。

任何想法我如何解决哪个列头ComboBox生成的事件?

DataGridColumn标题中的组合框-如何区分列

"哪个列头组合框生成了事件?"(ComboBox)sender是生成事件的ComboBox的句柄。

如果您需要访问标题,或者包含该组合框的列,您可以使用VisualTreeHelper,如下所述:我如何通过名称或类型找到WPF控件?

根据您问题中的信息,该线程的答案可能是您正在寻找的(由John Myczek) -为您想要的类型sub出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);