DataGridColumnHeader ContextMenu programmatically

I have this code in View.cs

var contextMenu = this.dataGridFacade.GiveContextMenuForDataGrid(this.DataGridAllJobs); this.DataGridAllJobs.ContextMenu = contextMenu; 

But I want to add this context menu for the title only. Is it possible?

+7
source share
1 answer

You just need to get the DataGridColumnHeadersPresenter of your DataGrid and set it to ContextMenu.

 var contextMenu = this.dataGridFacade.GiveContextMenuForDataGrid(this.DataGridAllJobs); var columnHeadersPresenter = this.DataGridAllJobs.SafeFindDescendant<DataGridColumnHeadersPresenter>(ip => ip.Name == "PART_ColumnHeadersPresenter"); if (columnHeadersPresenter != null) { columnHeadersPresenter.ContextMenu = contextMenu; } 

And here is the SafeFindDescendant extension method:

 public static class Visual_ExtensionMethods { /// <summary> /// Retrieves the first Descendant of the currren Visual in the VisualTree matching the given predicate /// </summary> /// <typeparam name="T"></typeparam> /// <param name="this">The current Visual.</param> /// <param name="predicate">An optional predicate that the descendant have to satisfy.</param> /// <returns></returns> public static T SafeFindDescendant<T>(this Visual @this, Predicate<T> predicate = null) where T : Visual { T result = null; if (@this == null) { return null; } // iterate on VisualTree children thanks to VisualTreeHelper int childrenCount = VisualTreeHelper.GetChildrenCount(@this); for (int i = 0; i < childrenCount; i++) { var currentChild = VisualTreeHelper.GetChild(@this, i); var typedChild = currentChild as T; if (typedChild == null) { // recursive search result = ((Visual)currentChild).SafeFindDescendant<T>(predicate); if (result != null) { break; } } else { if (predicate == null || predicate(typedChild)) { result = typedChild; break; } } } return result; } } 
+7
source

All Articles