C# 为什么当我在VisualStudio中运行我的程序时,我的组合框要花这么长时间才能下拉?

C# 为什么当我在VisualStudio中运行我的程序时,我的组合框要花这么长时间才能下拉?,c#,wpf,performance,mvvm,combobox,C#,Wpf,Performance,Mvvm,Combobox,在我的视图模型中,我有两个相关的属性。它们的实现如下所示: public string Code { get { return _Code; } set { if (_Code != value) { _Code = value; OnPropertyChanged("Code"); OnPropertyChanged("RelatedCodeList"); } } public Lis

在我的视图模型中,我有两个相关的属性。它们的实现如下所示:

public string Code
{
   get { return _Code; }
   set
   {
      if (_Code != value)
      {
         _Code = value;
         OnPropertyChanged("Code");
         OnPropertyChanged("RelatedCodeList");
      }
}

public List<Code> RelatedCodeList
{
   get
   {
      return CodeLists[Code];
   }
}
<ComboBox SelectedItem="{Binding RelatedCode, Mode=TwoWay}"
          ItemsSource="{Binding RelatedCodeList}">
代码列表
是一本
字典

我有一个绑定到
相关代码列表的
组合框
;其实现如下所示:

public string Code
{
   get { return _Code; }
   set
   {
      if (_Code != value)
      {
         _Code = value;
         OnPropertyChanged("Code");
         OnPropertyChanged("RelatedCodeList");
      }
}

public List<Code> RelatedCodeList
{
   get
   {
      return CodeLists[Code];
   }
}
<ComboBox SelectedItem="{Binding RelatedCode, Mode=TwoWay}"
          ItemsSource="{Binding RelatedCodeList}">

这似乎很简单,而且很有效,除了一件事。当我在UI中更改
code
,然后单击组合框时,需要两三秒钟的时间才能下拉。即使列表中的项目少于10项

这是什么原因造成的?这不是集合更改事件:
List
未实现
INotifyCollectionChanged
,而且无论如何集合没有更改。它似乎没有发生在视图模型内部;我在属性getter中设置了断点,一旦引发属性更改事件,getter就会中断;当组合框下降时,它们不会被调用。它似乎不是项呈现:没有为
code
类定义数据模板,在该类中实现
ToString()

我忽略了什么

编辑

我跟进了威尔的建议,发现除非在调试器下运行,否则不会发生这种情况。如果我只是运行可执行文件(甚至是调试版本),它的性能就很好


为了让这个问题变得有用,让我们改写一下:为什么会发生这种情况?而且,更重要的是,如果是调试器造成的,我有没有办法告诉你调试器是在胡编乱造,这样我就不会花上几个小时去寻找根本不存在的问题的原因了?

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

但是,使用我惊人的演绎能力,我建议您检查是否没有任何循环OnPropertyChanged调用发生-我注意到这些调用可能会暂停调试器,但在其他方面几乎没有被注意到


否则,请检查您的代码列表索引器。

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

在窗口/用户控件资源中包括以下内容

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

更新组合框XAML-

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


输出窗口中是否有可疑信息?我以前遇到过类似的情况,我认为这与UI自动化毫无明显原因地抛出异常有关。如果你能发布一些独立的代码来重现问题,这会很有帮助。在relatedcodeget或set方法中有没有相关的代码?您是否尝试删除SelectedItem绑定?您的
RelatedCodeList
集合中有多少项?您的输出窗口中是否存在任何
BindingErrors
?因为调试器已连接,并且VS正在将一组程序集加载到内存中?我最近经常遇到这种情况。没有绑定错误。输出窗口中没有任何类型的异常。我已经检测了这个过程中调用的所有setter和getter,没有一个需要10毫秒。但威尔认为调试器是罪魁祸首的想法值得称赞:这不会发生在VS之外。我同意我提供的任何东西都不应该引起问题。但是我找不到别的东西了
CodeList
是一个
字典
,所以它的索引器(除非发生了非常奇怪的事情)很好。我将一个监听器连接到PropertyChanged事件,那里也没有发生任何异常情况。