Home > OS >  Using ItemTemplate and DataTemplate creates a button within ListView. Why?
Using ItemTemplate and DataTemplate creates a button within ListView. Why?

Time:11-25

I have a situation with a ListView. Inside the item template there is a DataTemplate and inside the DataTemplate there is a ListViewItem and it's content is bound. When I click I want to select the item but when I hover my mouse over it, it seems like there is a button created with the ItemTemplate and DataTemplate . At the moment, I can select item by clicking somewhere else within the same row, but that doesn't work if I select the button. I use SelectedItem and if you click on the button within the item, the SelectedItem will not fired.

The ListView is linked to an ItemSource, and SelectedItem of the ListView is bound to a property

Further information: language is C#, ide is Visual Studio 2010.

I will leave my xaml code below, Thanks.


XAML

<ListView x:Name="myListView"
                  Grid.Column="0"
                  Grid.Row="2"
                  Height="Auto"
                  Margin="0,0,0,0"
                  SelectionChanged="SchemaListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ListViewItem Content="{Binding Path=Value}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

C#

void ReadData(string id)
        {
            var data = ExampleData.GetData(id);
                myListView.ItemsSource = data.Results;
            
        }

I've tried binding without ItemTemplate and DataTemplate also tried to link source in xaml but that didn't work

CodePudding user response:

You must not have a ListViewItem in the ItemTemplate of a ListView.

When the elements of the ItemsSource collection are not already ListViewItems (which they typically never are), the framework will automatically create a ListViewItem that becomes the "item container" element for each data item. This automatically generated ListViewItem uses the ItemTemplate as its ContentTemplate.

Besides that, use a ListBox instead of ListView when you do not set a ListView's View property.

So instead of a ListViewItem, use a ContentControl or perhaps a TextBlock:

<ListBox ...>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Value}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

If there is nothing more than a single content element, simply set the DisplayMemberPath property:

<ListBox ... DisplayMemberPath="Value"/>
  • Related