2012-09-15 27 views
5

ItemsControlオブジェクトからItemContainerタイプを決定したいと考えています。WPF ItemsControlの一般的なItemContainerタイプを取得する方法

var item = control as ItemsControl; 
    //HOW to get child container Type? 

ブレンドがこれを行う方法例:

enter image description here

Blendは何とか現在のTabControlタイプの子アイテムがTabItemであると判断します。

同じことをコードで行う方法は?

答えて

8

ItemsControlに由来するほとんどのクラスにStyleTypedPropertyAttributeがあります。 Property"ItemContainerStyle"と等しいものを取得します。この属性のStyleTargetTypeプロパティは、アイテムタイプを指定する必要があります。

基本クラスの属性を取得しないように注意する必要があります。また、これはほとんどのタイプ(TabControl,ListBox)で機能しますが、DataGridなどのいくつかのクラスには、この属性が付加されていません。ここで

私は組み込みのフレームワークの種類に使用するリストです:

var _itemsContainerTypeByContainerType = new Dictionary<Type, Type> { 
    { typeof(ComboBox), typeof(ComboBoxItem) }, 
    { typeof(ContextMenu), typeof(MenuItem) }, 
    { typeof(DataGrid), typeof(DataGridRow) }, 
    { typeof(DataGridCellsPresenter), typeof(DataGridCell) }, 
    { typeof(DataGridColumnHeadersPresenter), typeof(DataGridColumnHeader) }, 
    { typeof(HeaderedItemsControl), typeof(ContentPresenter) }, 
    { typeof(ItemsControl), typeof(ContentPresenter) }, 
    { typeof(ListBox), typeof(ListBoxItem) }, 
    { typeof(ListView), typeof(ListViewItem) }, 
    { typeof(Menu), typeof(MenuItem) }, 
    { typeof(MenuBase), typeof(MenuItem) }, 
    { typeof(MenuItem), typeof(MenuItem) }, 
    { typeof(MultiSelector), typeof(ContentPresenter) }, 
    { typeof(Selector), typeof(ContentPresenter) }, 
    { typeof(StatusBar), typeof(StatusBarItem) }, 
    { typeof(TabControl), typeof(TabItem) }, 
    { typeof(TreeView), typeof(TreeViewItem) }, 
    { typeof(TreeViewItem), typeof(TreeViewItem) } 
}; 
関連する問題