Said Amir
Said Amir

Reputation: 74

DataTemplate Doesn't Apply

I am new to WPF and some help would be appreciated.

I got a resource Dictionary where I am trying to style a ListViewItem or ItemTemplate ListView's Property, But both ways have failed.

First way:

Dictionary

<Style TargetType="ListViewItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel Orientation="Horizontal">
                    <Ellipse Height="45" Width="45" Fill="Gray"/>
                    <ContentPresenter/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

MainWindow

    <ListView Grid.Row="1" Background="LightSkyBlue">
        <ListViewItem>Text cannot be seen</ListViewItem>
    </ListView>

"This one doesn't show any text"

Second Way:

Dictionary

            <DataTemplate x:Key="LeftMenuButtons">
                <StackPanel Orientation="Horizontal">
                    <Ellipse Height="45" Width="45" Fill="Gray"/>
                    <ContentPresenter/>
                </StackPanel>
            </DataTemplate>

MainWindow

    <ListView ItemTemplate="{StaticResource LeftMenuButtons}" Grid.Row="1" >
        <ListViewItem>No Effect for DataTemplate Only Text Appears</ListViewItem>
    </ListView>

This Doesn't apply anything in DataTemplate.

If possible I would like to know what is going wrong in both two ways ... Thanks in advance.

Upvotes: 0

Views: 799

Answers (2)

thatguy
thatguy

Reputation: 22119

First Way - Control Template

Please specify the TargetType of the control template explicity.

<ControlTemplate TargetType="{x:Type ListViewItem}">

You could also give the list view item style a name, so it is not applied on all items in your scope, but only to the target list view.

<Style x:Key="ListViewItemStyle"
       TargetType="ListViewItem">

Make sure, that you assign the style to your target list view.

<ListView Grid.Row="1"
          Background="LightSkyBlue"
          ItemContainerStyle="{StaticResource ListViewItemStyle}">

Second Way - Data Template

First, data templates only work if your items are assigned via the ItemsSource property. If you directly assign ListViewItems to your list view, they will not be affected. You have to bind the ItemsSource to a collection. Second, you do not use a ContentPresenter in the data template, you bind to properties of the objects in the ItemsSource collection. In this example you would have a collection of strings that are assigned to the Text property of the TextBlock. Maybe this is beyond the scope of your question.

<ListView Grid.Row="1"
          ItemsSource="{Binding StringCollection}"
          ItemTemplate="{StaticResource LeftMenuButtons}"/>

<DataTemplate x:Key="LeftMenuButtons"
    <StackPanel Orientation="Horizontal">
        <Ellipse Height="45"
                 Width="45"
                 Fill="Gray"/>
        <TextBlock Text="{Binding}"/>
    </StackPanel>
</DataTemplate>

Upvotes: 1

Lana
Lana

Reputation: 1044

The code below works. You just forgot to write ControlTemplate TargetType.

    <Style x:Key="ListViewItemStyle"  TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <StackPanel Orientation="Horizontal">
                        <Ellipse Height="45" Width="45" Fill="Gray"/>
                        <ContentPresenter/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Upvotes: 0

Related Questions