为什么当我在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];
   }
}

CodeListsDictionary<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版本),它执行得很好。

因此,为了使这个问题真正有用,让我们重新定义一下:为什么会发生这种情况?更重要的是,如果是调试器的错,我有没有办法告诉调试器把事情搞砸了,这样我就不用花几个小时去寻找根本不存在的问题的原因了?

为什么当我在Visual Studio中运行程序时,我的ComboBox需要很长时间才能下拉?

这类问题很难回答,因为你没有提供足够的信息。您提供的任何东西都不可能导致此问题。

但是使用我惊人的推理能力,我建议你检查你没有任何循环OnPropertyChanged调用发生-我注意到这些会使调试器停滞,但几乎不会被注意到。

否则,检查您的CodeLists索引器

我发现WPF ComboBox缺乏虚拟堆栈面板,这使得UI渲染缓慢。包括虚拟堆栈面板是一个完美的解决方案。

将下列内容包含到您的窗口/用户控件资源

<ItemsPanelTemplate x:Key="VSP">
    <VirtualizingStackPanel/>
</ItemsPanelTemplate>

更新组合框XAML -

<ComboBox ItemsSource="{Binding Path=MyDataSource}"  DisplayMemberPath="Name" SelectedValuePath="Id" ItemsPanel="{StaticResource VSP}"/>