Унаследовано от itemsControl - Как изменить тип элементов?

Я пытаюсь улучшить ListView, Это в основном связано с изменениями в ListViewItem учебный класс. Поэтому я унаследовал от обоих, создав два элемента управления костюмом:

NestedListView : ListView 
NestedListViewItem : ListViewItem

Проблема в том, что теперь я хочу NestedListView"s <ItemsPresenter/> представлять NestedListViewItemс вместо обычного ListViewItems, Как мне этого добиться?

(Я почти не знаю, как <ItemsPresenter/> работает. Таким образом, любое объяснение в этой области может быть полезным).

2 ответа

Решение

Переопределить GetContainerForItemOverride метод и возвращает тип контейнера элемента, который вы хотите:

public class NestedListView : ListView
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new NestedListViewItem();
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is NestedListViewItem;
    }
}

Будьте осторожны, принятого ответа недостаточно для TreeView, если вы хотите, чтобы все потомки принадлежали к переопределенному подклассу TreeViewItem.

Вот полное решение:

  1. Переопределить класс TreeViewItem
      public class TreeViewItemEx : TreeViewItem
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TreeViewItemEx (); // Required to preserve the item type in all the hierarchy
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is TreeViewItemEx ;
    }
}
  1. Переопределить класс TreeView
      public class TreeViewEx : TreeView 
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TreeViewItemEx();
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is TreeViewItemEx;
    }
}
Другие вопросы по тегам