2011-01-20 6 views
21

すべてItemsControlのコンテンツはPanel rightに保存されていますか?私たちは、このようにXAMLで使用するパネルを指定することができます。ItemsControlの内容を保持するPanelのインスタンスを取得する方法は?

<ListView Name="LView"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate > 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

私の質問はどのように特定のItemsControlの(タイプItemsPanelTemplateの)ItemsPanelプロパティで使用されているPanelのインスタンスを取得するのですか?例えば、上記のコードサンプルのLViewと呼ばれるListViewはありますか?

Nameプロパティまたはx:Nameを使用することはできません。ItemsPanelを使用しているものであっても、ItemsControlのいずれの場合でも動作する必要があります。

ご不明な点がありましたらご意見ください、非常に簡単な解決策があると思います。複雑だと思われるのは、それを正しく説明できないからです。

+0

あなたはどこからそのインスタンスを取得しようとしていますか?それは 'ItemsControl'か、その中の項目テンプレートの1つからですか? –

+0

「ItemsPanelTemplate」から正確に。私は間違いなくアイテムテンプレートからそれを取得したくありません。 – drasto

+0

私はあなたの質問を正しく理解しましたか、他に何か探していましたか? –

答えて

15

あなたがFindName指定などを使用することはできませんので、あなたはこれがItemsPresenterが存在

private Panel GetItemsPanel(DependencyObject itemsControl) 
{ 
    ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl); 
    Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel; 
    return itemsPanel; 
} 

GetVisualChildの実装で、ほとんどの場合のために動作しますパネルの名前を知らないので、それは少しトリッキーです

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 

    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 

ただし、ItemsPanelは常に使用されるとは限りません。大きな説明については、Ian Griffithsのthis answerを参照してください。

2
protected Panel ItemsHost { 
    get { 
     return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost", 
      BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance, 
      null, this, null); 
    } 
} 

これは私のItemsControlの魅力のように機能します!つまり、内部にPanelにはIsItemsHost="True"が含まれていますが、それがなくても動作する可能性があります。

このスレッドの投稿:Can I access ItemsHost of ItemsControl using reflection?

関連する問題