DataGridColumn标题中的组合框-如何区分列
本文关键字:何区 标题 组合 DataGridColumn | 更新日期: 2023-09-27 18:02:22
我在DataGrid
列的标题中有一个ComboBox
。我想处理ComboBox
的SelectionChanged
事件,但我需要知道哪个控件(在哪个列的标题中)生成该事件。控件通过在调用列构造函数时将静态资源DataTemplate
分配给HeaderTemplate
放在标题中。
我想使用列数据上下文在ComboBox
上设置一些标识数据,但我无法访问该上下文。我可以很容易地访问DataGrid
数据模型上下文,但所有ComboBoxes
(列)的数据都是相同的。
任何想法我如何解决哪个列头ComboBox
生成的事件?
"哪个列头组合框生成了事件?"(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);