我在ComboBox
列的标题中有一个DataGrid
。我想处理SelectionChanged
的{{1}}事件,但我需要知道哪个控件(在哪个列的标题中)生成了该事件。在对列构造函数的调用中,控件通过分配给ComboBox
的静态资源DataTemplate
放入标头中。
我想使用列数据上下文在HeaderTemplate
上设置一些标识数据,但我无法访问该上下文。我可以轻松访问ComboBox
数据模型上下文,但它与所有DataGrid
(列)的数据相同。
知道如何解决哪个列标题ComboBoxes
生成了该事件?
答案 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);