继承自 itemsControl - 如何更改项目的类型?

Inherited from an itemsControl - How to change the type of the items?

我正在努力改进 ListView。这主要与 ListViewItem class 中的更改有关。所以我继承了两者,创建了两个服装控件:

NestedListView : ListView 
NestedListViewItem : ListViewItem

问题是现在我想要 NestedListView<ItemsPresenter/> 显示 NestedListViewItem 而不是常规的 ListViewItems。 我如何实现这一目标?

(我几乎不知道 <ItemsPresenter/> 是如何工作的。所以关于该领域的任何解释都可能有所帮助。

覆盖 GetContainerForItemOverride 方法和 return 您想要的项目容器类型:

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

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

注意,如果您希望所有后代都属于覆盖的 TreeViewItem 子class。

,则接受的答案对于 TreeView 是不够的

完整的解决方案如下:

  1. 覆盖 TreeViewItem class
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 class
public class TreeViewEx : TreeView 
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TreeViewItemEx();
    }

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