创建自定义ListViewItem(子类ListViewItem)

时间:2014-05-22 09:56:10

标签: wpf listviewitem subclassing

我从ListViewItem派生了一个类,它有一些自定义依赖项属性:

public class CustomListViewItem : ListViewItem
{
    public static DependencyProperty CustomDependencyProperty;
    ...
}

这个类还有一个ControlTemplate。

<Style TargetType="{x:Type local:CustomListViewItem}">
    <Style.Setters>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomListViewItem}">
                    ...
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>

现在我想在ListView而不是ListViewItem中使用这个CustomListViewItem。但是,当我尝试做类似的事情时:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type local:CustomListViewItem}">
        ...            
    </Style>
</ListView.ItemContainerStyle>

编译器说:“用于'CustomItem'类型的样式不能应用于'ListViewItem'类型。

我知道我可以使用ControlTemplate和ListViewItem TargetType来自定义ItemContainerStyle或DataTemplate以自定义ItemTemplate,但是我如何将ListViewItem子类化为替换我自己的Item类型?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

我在考虑this question之后找到了答案。核心思想是,不仅需要创建自定义ListViewItem,还需要创建自定义ListView并为其重写GetContainerForItemOverride()方法:

public class CustomListView : ListView
{
    static CustomListView()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomListView), new FrameworkPropertyMetadata(typeof(CustomListView)));
    }

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new CustomListViewItem();
    }
}

当然,为CustomListView提供合适的ControlTemplate也是必要的。 此外,PrepareContainerForItemOverride方法也很有用。