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
相关产品推荐
相关产品推荐

