为什么当我在Visual Studio中运行程序时,我的ComboBox需要很长时间才能下拉?
本文关键字:ComboBox 长时间 我的 Visual Studio 程序 运行 为什么 | 更新日期: 2023-09-27 18:07:06
在视图模型中,我有两个相关的属性。它们的实现是这样的:
public string Code
{
get { return _Code; }
set
{
if (_Code != value)
{
_Code = value;
OnPropertyChanged("Code");
OnPropertyChanged("RelatedCodeList");
}
}
public List<Code> RelatedCodeList
{
get
{
return CodeLists[Code];
}
}
CodeLists
是Dictionary<string, List<Code>>
。
我有一个与RelatedCodeList
结合的ComboBox
;它的实现是这样的:
<ComboBox SelectedItem="{Binding RelatedCode, Mode=TwoWay}"
ItemsSource="{Binding RelatedCodeList}">
这看起来很简单,而且很有效,除了一件事。当我在UI中更改Code
,然后单击组合框时,需要两到三秒钟才能下拉。即使列表中的条目少于10个
是什么原因导致的?这不是集合更改事件:List
没有实现INotifyCollectionChanged
,无论如何,集合没有更改。它似乎没有发生在视图模型内部;我在属性getter中设置了断点,一旦属性更改事件被触发,getter就会中断;它们不会在组合框下拉时被调用。它似乎不是项目呈现:没有为Code
类定义的数据模板,并且在该类中实现ToString()
是微不足道的。
我忽略了什么?
编辑
我遵循Will的建议,发现除非我在调试器下运行,否则不会发生这种情况。如果我只运行可执行文件(甚至是Debug版本),它执行得很好。
因此,为了使这个问题真正有用,让我们重新定义一下:为什么会发生这种情况?更重要的是,如果是调试器的错,我有没有办法告诉调试器把事情搞砸了,这样我就不用花几个小时去寻找根本不存在的问题的原因了?
这类问题很难回答,因为你没有提供足够的信息。您提供的任何东西都不可能导致此问题。
但是使用我惊人的推理能力,我建议你检查你没有任何循环OnPropertyChanged调用发生-我注意到这些会使调试器停滞,但几乎不会被注意到。
否则,检查您的CodeLists索引器
我发现WPF ComboBox缺乏虚拟堆栈面板,这使得UI渲染缓慢。包括虚拟堆栈面板是一个完美的解决方案。
将下列内容包含到您的窗口/用户控件资源
<ItemsPanelTemplate x:Key="VSP">
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
更新组合框XAML -
<ComboBox ItemsSource="{Binding Path=MyDataSource}" DisplayMemberPath="Name" SelectedValuePath="Id" ItemsPanel="{StaticResource VSP}"/>