【发布时间】:2011-11-07 22:30:19
【问题描述】:
在我的视图模型中,我有两个相关的属性。他们的实现如下所示:
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 版本),它的性能就很好。
因此,为了使这个问题真正有用,让我们改写一下:为什么会发生这种情况?而且,更重要的是,如果要怪调试器,我有什么办法可以告诉调试器正在把事情搞砸,这样我就不用花几个小时来寻找实际上并不存在的问题的原因?
【问题讨论】:
-
输出窗口中有什么可疑的地方吗?我之前遇到过这样的事情,我认为这与 UI-Automation 无缘无故地抛出异常有关。如果您可以发布一些能够重现问题的独立代码,那将会很有帮助。
-
RelatedCode get 或 set 方法中是否有相关代码?您是否尝试过删除 SelectedItem 绑定?
-
您的
RelatedCodeList收藏中有多少项?你的输出窗口中有BindingErrors吗? -
因为附加了调试器,而此时VS正在将一堆程序集加载到内存中?我最近经常遇到这种情况。
-
无绑定错误。 “输出”窗口中没有任何类型的例外。我已经对在这个过程中被调用的所有 setter 和 getter 进行了检测,而且没有一个需要多达 10 毫秒的时间。但是对于 Will 认为应该归咎于调试器的想法表示敬意:这不会发生在 VS 之外。
标签: c# wpf performance mvvm combobox