我正在将一个api调用到WPF listView中。我向每一行添加了CheckBox
,并试图选择CheckBox
的行,然后显示该值。
我的xaml文件:
<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>
还有我的listView_Click
方法,以及我尝试过的方法和产生的输出结果
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
}
我检查了过去的问题/答案,但没有发现与我想做的事情相符的事情。
答案 0 :(得分:1)
默认情况下,DataTemplate
中的ListView.ItemTemplate
将绑定到ItemsSource
中的数据项。如果要绑定到ListViewItem
本身(包含DataTemplate
),可以使用RelativeSource
:
...
IsChecked="{Binding IsSelected,
RelativeSource={RelativeSource AncestorType=ListViewItem}}"
...
获取当前所选项目的正确属性是SelectedItem
,而SelectedValue
仅与SelectedValuePath
结合使用。
所选项目更改时执行操作的事件是SelectionChanged
。
private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MyDataObject selectedItem = myListView.SelectedItem;
Selected_label.Text = selectedItem.SomeTextProperty;
}
不过,很常见,您将绑定到SelectedItem
而不是直接处理SelectionChanged
。