WPF ListView点击复选框未选中行及获取勾选项问题咨询
WPF ListView CheckBox 选中问题解决方案
最快修复崩溃问题
你不需要依赖listView.SelectedItem获取当前行数据,触发事件的CheckBox的DataContext本身就对应当前行绑定的module对象,直接取值即可:
private void CheckBox_Checked(object sender, RoutedEventArgs e) { module v = (module)((CheckBox)sender).DataContext; _client.AddClientModule(v.path); } private void CheckBox_Unchecked(object sender, RoutedEventArgs e) { module v = (module)((CheckBox)sender).DataContext; _client.RemoveClientModule(v.name); }
实现点击CheckBox自动选中所在行
如果需要兼容原有依赖SelectedItem的逻辑,可以通过查找可视化树的方式,点击CheckBox时主动选中当前行:
- 先添加查找父控件的辅助方法
using System.Windows.Media; private T FindVisualParent<T>(DependencyObject child) where T : DependencyObject { DependencyObject parentObject = VisualTreeHelper.GetParent(child); if (parentObject == null) return null; T parent = parentObject as T; return parent ?? FindVisualParent<T>(parentObject); }
- 给CheckBox添加预览鼠标按下事件,主动选中当前行
XAML修改:
<CheckBox Margin="5, 0" IsChecked="{Binding loaded}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" PreviewMouseDown="CheckBox_PreviewMouseDown"/>
对应事件实现:
private void CheckBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) { var listViewItem = FindVisualParent<ListViewItem>((DependencyObject)sender); if (listViewItem != null) { listView1.SelectedItem = listViewItem.DataContext; listViewItem.IsSelected = true; } }
获取所有已勾选的条目
WPF原生没有内置CheckedItems属性,但你已经将CheckBox的选中状态绑定到了数据源的loaded字段,直接遍历数据源筛选即可,比WinForms的实现更灵活:
// 假设你绑定的数据源集合名为moduleList var checkedItems = moduleList.Where(m => m.loaded).ToList(); // 如果没有存数据源变量,也可以直接从ListView的Items中获取 var checkedItems = listView1.Items.Cast<module>().Where(m => m.loaded).ToList();
注意:如果需要实现修改
loaded字段时界面自动同步,你的module类需要实现INotifyPropertyChanged接口。
内容的提问来源于stack exchange,提问作者Meme Machine
相关产品推荐
相关产品推荐

