2012-12-06 7 views
7

Ich habe diesen Code in View.csDataGridColumnHeader ContextMenu programmatisch

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

this.DataGridAllJobs.ContextMenu = contextMenu; 

Aber ich will nur dieses Kontextmenü für Header hinzuzufügen. Ist es möglich?

Antwort

7

Sie müssen nur die DataGridColumnHeadersPresenter Ihres DataGrid abrufen und sein ContextMenu festlegen.

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

Und hier ist die SafeFindDescendant Erweiterungsmethode:

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; 
    } 
} 
+0

ich dir 50 Rating-Punkte gewinnen thnink. Meine so hart verdient 50 Punkte ..) Warum hast du gewartet, bis ich es mit Kopfgeld poste? =) Danke für deine Antwort!) – MikroDel

+1

Sorry, ich habe dieses nicht früher gesehen :) Ich versuche so viele WPF-Fragen wie möglich zu beantworten, kann aber nicht alle beantworten. Allerdings schaue ich mir immer Bounties an :) Vergiss nicht als Antwort zu markieren, wenn es dein Problem gelöst hat! – Sisyphe

+0

Ihre Frage wurde erhöht, da es interresiert war. Das wird 10rep weniger für dein Kopfgeld verloren sein;) – Sisyphe