C# DataGrid DataGridComboxColumn在折叠后丢失其值

C# DataGrid DataGridComboxColumn在折叠后丢失其值,c#,wpf,xaml,datagrid,datagridcomboboxcolumn,C#,Wpf,Xaml,Datagrid,Datagridcomboboxcolumn,我有一个GridView,其中包含datagridcomboxcolumn,它第一次工作正常,但是当将列visibility设置为collapsed,然后再次将visibility返回到visible时,该列将丢失其值。但与之有界的属性仍然具有正确的值 刷新DataContext时,所有值都被正确绑定 我添加了一个测试转换器,并注意到当折叠列时,会触发回调方法,并且值为null <DataGridComboBoxColumn SelectedValueBinding="{Binding D

我有一个
GridView
,其中包含
datagridcomboxcolumn
,它第一次工作正常,但是当将列
visibility
设置为
collapsed
,然后再次将
visibility
返回到
visible
时,该列将丢失其值。但与之有界的属性仍然具有正确的值

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

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

<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>

我可以复制您的问题。您可以通过处理
CellTemplate
中的
ComboBox
Loaded
事件来解决此问题,并重新设置
SelectedValue
属性:

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

另一个解决方案是将
datagridcomboxcolumn
替换为
DataGridTemplateColumn
。然后,您希望将
组合框的
SelectedItem
属性绑定到数据对象的
Db
属性,以便能够在
单元格模板中显示
Db
对象的
名称
属性,您需要实现INotifyPropertyChanged on TestList,以便UI反映更改已经实现并且工作正常,更新datacontext可以正确更新所有值。您可以发布更多代码详细信息吗?转换器我的意思是转换器没有任何逻辑,它只是检查值。折叠列时,将调用convert back方法,值为null。返回与convert方法中返回的可见性相同的可见性。加载时,我刚刚调用DataContext并引发OnPropertyChanged,它工作正常。谢谢
private void OnLoaded(object sender, RoutedEventArgs e)
{
    ComboBox cmb = sender as ComboBox;
    dynamic dataObject = cmb.DataContext;
    cmb.SelectedValue = dataObject.DbId;
}