Унаследовано от 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.
Вот полное решение:
- Переопределить класс 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 ;
}
}
- Переопределить класс TreeView
public class TreeViewEx : TreeView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new TreeViewItemEx();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is TreeViewItemEx;
}
}