DataGrid DataGridComboBoxColumn 在折叠后失去其价值

DataGrid DataGridComboBoxColumn lose its value after collapsing

我有一个 GridViewDataGridComboBoxColumn,它第一次工作正常,但是当将列 visibility 设置为 collapsed,然后 return 再次将 visibility 更改为 visible,该列将失去其值。但是与之绑定的 属性 仍然具有正确的值。

刷新 DataContext 时,所有值都正确绑定。

我添加了一个测试转换器,并注意到在折叠列时触发了回调方法,并且值为空。

<DataGridComboBoxColumn SelectedValueBinding="{Binding DbId}"
                        DisplayMemberPath="Name"
                        SelectedValuePath="Id"
                        Visibility="Visible">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding TestList}"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding TestList}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

我可以重现你的问题。您可以通过处理 CellTemplateComboBoxLoaded 事件并重新设置 SelectedValue 属性:

来解决它
<DataGridComboBoxColumn.ElementStyle>
    <Style TargetType="ComboBox">
        <Setter Property="ItemsSource" Value="{Binding TestList}"/>
        <EventSetter Event="Loaded" Handler="OnLoaded" />
    </Style>
</DataGridComboBoxColumn.ElementStyle>

private void OnLoaded(object sender, RoutedEventArgs e)
{
    ComboBox cmb = sender as ComboBox;
    dynamic dataObject = cmb.DataContext;
    cmb.SelectedValue = dataObject.DbId;
}

另一种解决方案是将 DataGridComboBoxColumn 替换为 DataGridTemplateColumn。然后,您想要将 ComboBoxSelectedItem 属性 绑定到数据对象的 Db 属性 以便能够显示 Name 属性 Db 对象在 CellTemplate.