1
votes

I derived a class from ListViewItem, it has some custom dependency properties:

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

There is also a ControlTemplate for this class.

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

Now I want to use this CustomListViewItem in a ListView instead of ListViewItem. But when I try to do something like:

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

compiler says: "A style intended for type 'CustomItem' cannot be applied to type 'ListViewItem".

I know that I can use ControlTemplate with ListViewItem TargetType to customize ItemContainerStyle or DataTemplate to customize ItemTemplate, but how can I subclass ListViewItem to substitute my own Item type?

Any help will be appreciated.

1
why do you need custom listview item.. there could be some other way of achieving what you are trying to doNitin

1 Answers

3
votes

I found the answer after considering this question. The core idea is that it is necessary to create not only a custom ListViewItem, but also a custom ListView and override GetContainerForItemOverride() method for it:

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

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

Of course, it's also necessary to provide a proper ControlTemplate for a CustomListView. Also PrepareContainerForItemOverride method will be useful.