C# 只有当ItemsSource依赖于行时,才会清空DataGrid中的组合框

C# 只有当ItemsSource依赖于行时,才会清空DataGrid中的组合框,c#,.net,wpf,combobox,datagrid,C#,.net,Wpf,Combobox,Datagrid,我发现自己处于这样一种情况下,DataGridRow中给定的组合框是否被清空取决于它的itemsource是否绑定到DataGrid中的行或父行 具体考虑以下WPF窗口< /代码>: 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); DataContext=新的ViewModel(); } 私有无效选择器\u OnSelectionChanged(对象发送方,SelectionChangedEventArgs e) { if(((组合框)发件人).Items.Count==0)

我发现自己处于这样一种情况下,
DataGridRow
中给定的
组合框是否被清空取决于它的
itemsource
是否绑定到
DataGrid
中的行或父行

具体考虑以下WPF<代码>窗口< /代码>:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
DataContext=新的ViewModel();
}
私有无效选择器\u OnSelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
if(((组合框)发件人).Items.Count==0)
抛出新的InvalidOperationException(“这似乎不太可能!”);
}
}
然后,下面的示例正如我所期望的那样工作;也就是说,
Selector\u OnSelectionChanged
中的
InvalidOperationException
从未被调用,这对我来说很有意义,因为没有涉及空的
组合框


公共类视图模型
{
公共视图模型()
{
项目=新列表
{
新型号{SelectedName=“b”},
新模型{SelectedName=“a”}
};
}
公共静态列表名称{get;set;}=新列表
{
“a”、“b”
};
公共列表项{get;set;}
}
公共类模型
{
公共字符串SelectedName{get;set;}
}
如果现在我将列表
名称
移动到模型类(在我的情况下,这恰好是我想要的,因为行本身对
组合框
的内容施加了约束)并相应地更新
绑定
,那么我确实遇到了异常,尽管据我所知,所涉及的
组合框
与上面的示例一样非空


公共类视图模型
{
公共视图模型()
{
项目=新列表
{
新型号{SelectedName=“b”},
新模型{SelectedName=“a”}
};
}
公共列表项{get;set;}
//此处已删除名称
}
公共类模型
{
公共字符串SelectedName{get;set;}
//现在有人搬进来了
公共静态列表名称{get;set;}=新列表
{
“a”、“b”
};
}

所有的绑定都是一样的,唯一的区别是有一个瞬间,
组合框
是空的。所以问题变成了:是什么导致了这种情况,有没有办法避免这种情况?

在WPF中有很多延迟的东西,通常的解决方案是通过
调度程序将其排队来延迟操作。您可能会遇到虚拟化问题,例如,
ListBox
的虚拟化问题默认为打开。这里的问题是为什么要使用
SelectionChanged
事件(顺便说一句,命名错误,
OnXXX
是虚拟事件提升程序,而不是处理程序)?也许有更好的方法解决您的X问题(请参阅)。使用此事件的唯一原因是提供一个最小的工作示例,突出显示两种情况之间的差异。在实践中,这种差异最终会对免费方法背后的代码产生影响;例如,我在最内部绑定上有一个转换器时遇到了这个问题,调用转换器的参数将取决于采用了这两种方法中的哪一种。数据模板和/或虚拟化很棘手。如果在出现异常时选中
ComboBox
DataContext
,它将是
{DisconnectedItem}
(由于虚拟化、数据模板或两者兼而有之),您可以在尝试执行正常操作之前选中此项。若您想解决转换器问题,那个么更具体地说,尝试针对这种情况生成。WPF中有许多延迟的东西,通常的解决方案是通过
调度程序将其排队来延迟操作。您可能会遇到虚拟化问题,例如,
ListBox
的虚拟化问题默认为打开。这里的问题是为什么要使用
SelectionChanged
事件(顺便说一句,命名错误,
OnXXX
是虚拟事件提升程序,而不是处理程序)?也许有更好的方法解决您的X问题(请参阅)。使用此事件的唯一原因是提供一个最小的工作示例,突出显示两种情况之间的差异。在实践中,这种差异最终会对免费方法背后的代码产生影响;例如,我在最内部绑定上有一个转换器时遇到了这个问题,调用转换器的参数将取决于采用了这两种方法中的哪一种。数据模板和/或虚拟化很棘手。如果在异常时刻选中
组合框的
DataContext
,则它将是
{{DisconnectedItem}
(由于虚拟化、数据模板或两者),您可以选中此项