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

时间:2018-02-02 17:48:36

标签: wpf xaml listviewitem itemspresenter

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

NestedListView : ListView 
NestedListViewItem : ListViewItem

问题是,现在我希望NestedListView的{​​{1}}提供<ItemsPresenter/>而不是常规NestedListViewItem。 我该如何实现这一目标?

(我几乎不知道 ListViewItems如何运作。所以对该领域的任何解释都会有所帮助。)

2 个答案:

答案 0 :(得分:3)

覆盖GetContainerForItemOverride方法并返回所需的项目容器类型:

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

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

答案 1 :(得分:0)

请注意,如果您希望所有后代都属于被覆盖的 TreeViewItem 子类,那么接受的答案对于 TreeView 来说是不够的。

这是完整的解决方案:

  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;
    }
}