如何通过复选框设置WPF ListView整行选中(SelectedItem)
问题:点击WPF ListView中的复选框时自动选中对应行
我有一个包含多列GridViewColumn和两个互斥复选框的WPF ListView,目前只能通过鼠标点击行本身来选中整行。希望点击这两个复选框中的任意一个时,自动选中对应的整行,方便后续使用该行数据。
当前XAML布局代码
<ListView Margin="6,2,160,50" Name="EditorList" FontFamily="Calibri" Background="Silver" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="False" MouseWheel="EditorList_MouseWheel" MouseRightButtonUp="EditorList_MouseRightButtonDown" SelectionMode="Single" SelectionChanged="EditorList_SelectionChanged" > <ListView.View> <GridView> <GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Path=Name}"/> <GridViewColumn Header="Image" Width="60" > <GridViewColumn.CellTemplate> <DataTemplate> <Image Source="{Binding Mode=TwoWay, Path=ImageSource, UpdateSourceTrigger=PropertyChanged}" Height="50" Width="50" Margin="1" Stretch="Uniform" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Position X" Width="75" DisplayMemberBinding="{Binding Path=Position[0], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Position Y" Width="75" DisplayMemberBinding="{Binding Path=Position[1], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Position Z" Width="75" DisplayMemberBinding="{Binding Path=Position[2], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Rotation X" Width="75" DisplayMemberBinding="{Binding Path=Rotation[0], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Rotation Y" Width="75" DisplayMemberBinding="{Binding Path=Rotation[1], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Rotation Z" Width="75" DisplayMemberBinding="{Binding Path=Rotation[2], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Scale X" Width="75" DisplayMemberBinding="{Binding Path=Scale[0], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Scale Y" Width="75" DisplayMemberBinding="{Binding Path=Scale[1], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Scale Z" Width="75" DisplayMemberBinding="{Binding Path=Scale[2], UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="Material" Width="75" DisplayMemberBinding="{Binding Path=Material, UpdateSourceTrigger=PropertyChanged}" /> <GridViewColumn Header="To Do" Width="100"> <GridViewColumn.CellTemplate> <DataTemplate> <StackPanel x:Name="stackpanel" Orientation="Vertical"> <CheckBox Content="Delete" Tag="{Binding ElementName=stackpanel}" IsThreeState="False" Name="toD" Checked="ToD_Checked" IsChecked="{Binding Path=ToDelete, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ToolTip="delete this item" /> <CheckBox Content="Change" Tag="{Binding ElementName=stackpanel}" IsThreeState="False" Name="toC" Checked="ToC_Checked" IsChecked="{Binding Path=ToChange, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ToolTip="change to another item" /> </StackPanel> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView>
现有C#事件处理代码
private void ToD_Checked(object sender, RoutedEventArgs e) { if (sender is CheckBox cbSender) { if (cbSender.Tag is StackPanel stackpanel) { if (stackpanel.FindName("toC") is CheckBox cb1) { cb1.IsChecked = !cbSender.IsChecked; } ComboChangeItem.Visibility = Visibility.Collapsed; } } } private void ToC_Checked(object sender, RoutedEventArgs e) { if (sender is CheckBox cbSender) { if (cbSender.Tag is StackPanel stackPanel) { if (stackPanel.FindName("toD") is CheckBox cb) { cb.IsChecked = !cbSender.IsChecked; } ComboChangeItem.Visibility = Visibility.Visible; } } }
解决方案
在复选框的Checked事件处理逻辑中,添加对应代码即可实现点击复选框时自动选中对应行:
针对「Change」复选框的处理
将以下代码加入ToC_Checked方法中:
EditorObjects selectedItem = EditorList.ItemsSource.Cast<EditorObjects>().First(a => a.ToChange); if (selectedItem != null) { EditorList.SelectedItem = selectedItem; }
针对「Delete」复选框的处理
将以下代码加入ToD_Checked方法中:
EditorObjects selectedItem = EditorList.ItemsSource.Cast<EditorObjects>().First(a => a.ToDelete); if (selectedItem != null) { EditorList.SelectedItem = selectedItem; }
修改后,点击任意一个复选框时,对应的行就会被自动选中。
内容的提问来源于stack exchange,提问作者defiant2369
相关产品推荐
相关产品推荐

