今天早上我一直在解决一个“慢”的WPF ComboBox问题,希望有人能给出调试此类问题的技巧。
假设我有两个ComboBox,A和B。当A改变时,B中的项目也会改变。ComboBoxes分别将它们的SelectedItem和ItemsSource数据绑定如下:
<ComboBox Grid.Column="1" ItemsSource="{Binding Names}" SelectedItem="{Binding CurrentName, Mode=TwoWay}" Margin="3" MinWidth="100" />
<ComboBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding SubNames}" SelectedItem="{Binding CurrentSubName, Mode=TwoWay}" Margin="3" MinWidth="100" />
每当需要更改B中的列表时,我会通过清除SubNames,然后根据A中的SelectedItem重新添加条目来完成。这样做是因为用新的
ObservableCollection<string>
覆盖SubNames会破坏数据绑定。在一台计算机上,一切都像你期望的那样运行。选择A,然后单击B,新项目立即弹出。在另一台计算机上,当我这样做时,ComboBox渲染之前可能会有多达5秒的暂停。项目数量完全相同。一个区别是,在慢速机器上,有与硬件通信相关的后台任务正在进行。我冻结了所有这些线程,但没有帮助。
我最大的问题是我甚至不知道从哪里开始寻找。我需要看到系统在单击ComboBox时正在执行的操作。我正在使用数据绑定,因此无法在任何地方设置断点。我尝试更改SubNames的声明,从...开始。
public ObservableCollection<string> SubNames { get; set; }
to
private ObservableCollection<string> subnames_ = new ObservableCollection<string>();
public ObservableCollection<string> SubNames
{
get { return subnames_; }
set { subnames_ = value; }
}
然后在getter和setter中设置断点,查看是否存在过多的读写操作,但没有发现任何问题。
有人能建议我下一步该怎么做来确定这个减速的原因吗?我不认为它与ComboBox的默认模板有任何关系,就像这篇文章所描述的那样。