0

I'm calling an api into a WPF listView. I added a CheckBox to each row and am trying to select a row the CheckBox and then display that value.

My xaml file:

            <ListView x:Name="myListView"  
                      SelectedValue="{Binding title}" 
                      Height="550" Margin="35,149,-202.2,0" 
                      VerticalAlignment="Top"
                      Background="AntiqueWhite" Grid.ColumnSpan="2"                   
                      SelectionChanged="MyListView_SelectionChanged">
                <ListView.ItemTemplate>                
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" >
                            <CheckBox 
                                Name="myCheckBox"
                                Click="listView_Click"
                                IsChecked="{Binding IsChecked}" 
                                Margin="5, 0"/>
                            <TextBlock Text=" " />
                            <TextBlock Text="{Binding title}" />
                            <TextBlock Text=", " />
                            <TextBlock Text="{Binding publisher}" />
                            <TextBlock Text=", " />
                            <TextBlock Text="{Binding price}" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>            
            </ListView> 

And my listView_Click method, with what I've tried and the output it produced

    private void listView_Click(object sender, RoutedEventArgs e)
    {
        //Selected_label.Text = myListView.ItemsSource.ToString();
        //Output = System.Collections.Generic.List`1[ShortBoxedUI.ShortBoxed+Comics]

        //Selected_label.Text = myListView.Items.ToString();
        //Output = System.Windows.Controls.ItemCollection

        //Selected_label.Text = myListView.ToString();
        //Output = System.Windows.Controls.ListView Items.Count:352                
     } 

I checked the past questions/answers and didn't find anything that aligned with what I'm trying to do.

1 Answer 1

1

By default, the DataTemplate in ListView.ItemTemplate will bind to the data item from ItemsSource. If you want to bind to the ListViewItem itself (which is housing the DataTemplate), you can use RelativeSource:

...
IsChecked="{Binding IsSelected,
            RelativeSource={RelativeSource AncestorType=ListViewItem}}"
...

The correct property to get the currently selected item is SelectedItem, while SelectedValue would only be used in conjunction with SelectedValuePath.

And the event for doing something when the selected item changes is SelectionChanged.

private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MyDataObject selectedItem = myListView.SelectedItem;
    Selected_label.Text = selectedItem.SomeTextProperty;
}

Commonly, though, you would bind to SelectedItem rather than handle SelectionChanged directly.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.