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

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,提问作者مجتبی حکیمیان

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:05:15