WPF中DataGrid行内ComboBox数据填充及DataGridGroupe上下文异常
问题解决方案
1. 解决DataGridGroupe不存在于当前上下文的问题
- 先确认XAML中
DataGrid的x:Name="DataGridGroupe"拼写完全正确(大小写、无空格),且后台代码所在类与XAML的代码后置类一致。 - 若在非UI线程访问
DataGridGroupe,需通过Dispatcher调度到UI线程:Application.Current.Dispatcher.Invoke(() => { // 此处执行DataGrid相关操作 }); - 避免直接遍历
DataGridRow(因DataGrid默认虚拟化,仅可见行生成实例),直接遍历Items集合更可靠:foreach (var item in DataGridGroupe.Items) { if (item is USAGERS user) { // 处理当前用户行逻辑 } }
2. 解决所有ComboBox被最后一个用户数据填充的问题
问题核心是所有ComboBox绑定了同一个数据源实例(引用类型共享),需为每个用户生成独立数据源:
- 给
USAGERS类添加独立集合属性:public class USAGERS { // 原有属性 public bool IsSelected { get; set; } public string CodeUsager { get; set; } // 新增:当前用户的日程集合 public List<EMPLOIDUTEMPS> UserSchedules { get; set; } } - 预处理选中用户的数据源,赋值到对应属性:
foreach (USAGERS us in _ListeUsagers) { if (us.IsSelected) { List<EMPLOIDUTEMPS> EdTassocie = new List<EMPLOIDUTEMPS>(); if (ListEdTTemps != null) { // 简化筛选逻辑 EdTassocie = ListEdTTemps.Where(e => e.CodeUsager == us.CodeUsager).Distinct().ToList(); } List<EMPLOIDUTEMPS> EdTcombine = new List<EMPLOIDUTEMPS>(); EMPLOIDUTEMPS separateur = new EMPLOIDUTEMPS { Nom = "----------------------------" }; if (EdTassocie.Count > 0 && EmploisDuTemps.Count > 0) { EdTcombine.AddRange(EdTassocie); EdTcombine.Add(separateur); EdTcombine.AddRange(EmploisDuTemps); } else if (EmploisDuTemps.Count > 0) { EdTcombine.AddRange(EmploisDuTemps); } // 给当前用户绑定独立数据源 us.UserSchedules = EdTcombine; } } - 修改XAML中ComboBox列的绑定,直接关联用户的独立集合:
<DataGridComboBoxColumn Header="Schedules" ItemsSource="{Binding UserSchedules}" DisplayMemberPath="Nom"/>
3. 在第一轮foreach前插入对应行
预处理完用户数据源后,直接将选中用户添加到DataGrid的Items中:
// 清空原有行(按需选择) DataGridGroupe.Items.Clear(); // 添加选中用户到DataGrid foreach (USAGERS us in _ListeUsagers.Where(u => u.IsSelected)) { DataGridGroupe.Items.Add(us); }
备选:手动查找行内ComboBox赋值(非推荐)
若无法使用数据绑定,可通过可视化树查找行内ComboBox并赋值:
for (int i = 0; i < DataGridGroupe.Items.Count; i++) { DataGridRow row = (DataGridRow)DataGridGroupe.ItemContainerGenerator.ContainerFromIndex(i); if (row != null) { ComboBox cb = FindVisualChild<ComboBox>(row, "schedules"); if (cb != null) { var user = DataGridGroupe.Items[i] as USAGERS; cb.ItemsSource = user.UserSchedules; } } } // 辅助方法:查找指定名称的可视化子元素 private T FindVisualChild<T>(DependencyObject parent, string name) where T : FrameworkElement { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { DependencyObject child = VisualTreeHelper.GetChild(parent, i); if (child is T element && element.Name == name) { return element; } T result = FindVisualChild<T>(child, name); if (result != null) { return result; } } return null; }
内容的提问来源于stack exchange,提问作者ethan jorand
相关产品推荐
相关产品推荐

