WPF DataGridComboBoxColumn更新后UI不显示新项求助
解决方案
1. 修正DataGridComboBoxColumn的绑定配置
DataGridComboBoxColumn的UI更新问题大多源于绑定参数不匹配,需确保SelectedValueBinding、SelectedValuePath和DisplayMemberPath正确关联:
<DataGridComboBoxColumn Header="FHES" x:Name="FHES_COLUMN" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=FhesOptions}" SelectedValueBinding="{Binding FHES, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="FHES" DisplayMemberPath="NAME_FHES"/>
ItemsSource:绑定到窗口/ViewModel中存储PGET_LST选项的集合(需是实现INotifyCollectionChanged的类型,比如ObservableCollection<PGET_LST>)SelectedValueBinding:绑定到KHAZANEH_DATA的FHES属性,开启双向绑定并实时更新源SelectedValuePath:指定PGET_LST中作为选中值的属性(需与SelectedValueBinding的属性类型一致)DisplayMemberPath:指定下拉列表中显示的文本属性(即NAME_FHES)
2. 确保KHAZANEH_DATA实现INotifyPropertyChanged
你提到PGET_LST已实现该接口,但绑定的KHAZANEH_DATA对象的FHES和NAME_FHES属性也必须触发变更通知,否则UI无法感知属性更新:
public class KHAZANEH_DATA : INotifyPropertyChanged { private string _fhes; public string FHES { get => _fhes; set { if (_fhes != value) { _fhes = value; OnPropertyChanged(nameof(FHES)); } } } private string _nameFhes; public string NAME_FHES { get => _nameFhes; set { if (_nameFhes != value) { _nameFhes = value; OnPropertyChanged(nameof(NAME_FHES)); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
3. 优化CellEditEnding事件的更新逻辑
在事件中直接修改当前绑定的KHAZANEH_DATA对象属性,而非通过重置列ItemsSource的方式强制更新:
private void PGET_LST_SUB_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { if (e.Column == FHES_COLUMN && e.EditAction == DataGridEditAction.Commit) { var currentRowData = e.Row.Item as KHAZANEH_DATA; if (currentRowData == null) return; // 此处替换为你获取新FHES和NAME_FHES的业务逻辑 var selectedOption = (e.EditingElement as ComboBox)?.SelectedItem as PGET_LST; if (selectedOption != null) { currentRowData.FHES = selectedOption.FHES; currentRowData.NAME_FHES = selectedOption.NAME_FHES; } } }
- 直接操作绑定对象的属性,借助
INotifyPropertyChanged自动通知UI更新 - 确保操作在UI线程执行(若涉及异步逻辑,需用
Dispatcher.Invoke切换)
4. 替代方案:使用DataGridTemplateColumn
若DataGridComboBoxColumn的绑定问题仍无法解决,可改用更灵活的DataGridTemplateColumn,直接控制显示和编辑模板:
<DataGridTemplateColumn Header="FHES"> <!-- 单元格显示模板 --> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding NAME_FHES}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <!-- 单元格编辑模板 --> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=FhesOptions}" SelectedValue="{Binding FHES, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="NAME_FHES" SelectedValuePath="FHES"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn>
该方案能更精准地控制绑定逻辑,避免DataGridComboBoxColumn的固有绑定限制。
内容的提问来源于stack exchange,提问作者مجتبی حکیمیان
相关产品推荐
相关产品推荐

