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

WPF MVVM模式下自动生成列DataGrid模板列ComboBox绑定问题

解决方案

第一步:修正DataTable的列定义

你之前把Second列的类型设为了string,这是错误的根源,需要把它调整为存储ObservableCollection<SomeModel>类型,如果需要存储ComboBox的选中值,额外新增一列存储选中结果:

private void CreateDataTable(IEnumerable<MapModel> mapDataItems)
{
    MapDataTable.Clear();

    DataTable dataTable = new DataTable("MapDataTable");
    dataTable.Columns.Add("First", typeof(string));
    // 修改Second列的类型为集合类型
    dataTable.Columns.Add("Second", typeof(ObservableCollection<SomeModel>));
    // 新增列存储ComboBox选中值
    dataTable.Columns.Add("SelectedSecond", typeof(string));

    var mapData = new ObservableCollection<MapModel>();
    foreach (var item in mapDataItems)
    {
         mapData.Add(item);
    }
    MapDataList.Add(mapData);

    foreach (MapModel item in mapDataItems)
    {
         DataRow dataRow = dataTable.NewRow();
         dataRow[0] = item.Name;
         // 直接存入集合对象,不会被转成字符串
         dataRow[1] = item.SomeValues;
         // 可选:设置默认选中值
         dataRow[2] = item.SomeValues.FirstOrDefault()?.Name;
         dataTable.Rows.Add(dataRow);
     }
     MapDataTable = dataTable;
 }

第二步:修正DataTemplate的绑定路径

DataGrid绑定DataTable时,每行的DataContext是DataRowView类型对象,访问对应列的值需要用[列名]的绑定语法,直接修改你的资源代码即可:

<Grid.Resources>
    <DataTemplate x:Key="SecondCellTemplate">
       <!-- 绑定选中值列显示 -->
       <TextBlock Text="{Binding Path=[SelectedSecond], Mode=OneWay}" />
    </DataTemplate>
    <DataTemplate x:Key="SecondCellEditingTemplate">
       <ComboBox
           DisplayMemberPath="Name"
           <!-- 绑定当前行Second列存储的集合 -->
           ItemsSource="{Binding Path=[Second], Mode=OneWay}"
           <!-- 选中值双向绑定到专门的存储列 -->
           SelectedValue="{Binding Path=[SelectedSecond], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
           SelectedValuePath="Name" />
    </DataTemplate>
</Grid.Resources>

修改完成后每行的ComboBox会独立加载对应MapModel的SomeValues集合,不会共享全局列表,完全符合你的需求。


内容的提问来源于stack exchange,提问作者Melissa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:15:05