You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:24