2012-12-06 17 views
7

私はView.csDataGridColumnHeaderのContextMenuは、プログラム

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

this.DataGridAllJobs.ContextMenu = contextMenu; 

にこのコードを持っているしかし、私はヘッダーのみのため、このコンテキストメニューを追加したいです。出来ますか?

答えて

7

DataGridのDataGridColumnHeadersPresenterを取得し、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; 
} 

そしてここSafeFindDescendant拡張メソッドです:

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

私はあなたがこの50個の評判ポイントを獲得thnink。私の懸命に50ポイントを得た..)なぜ私は賞金とそれを投稿するまで待っていたのですか? =)Thxあなたの答え! ) – MikroDel

+1

申し訳ありませんが私はすぐにこれを見ていない:)私はできるだけ多くのWPFの質問に答えることを試みるが、すべてに答えることはできません。しかし、私はいつも賞品を見ています:)あなたの問題を解決したら答えとしてマークすることを忘れないでください! – Sisyphe

+0

あなたの質問は中断されていました。それはあなたの恩恵のために失われた10repより少なくなります;) – Sisyphe