为什么我的组合框会在itemssource更改时冻结?

时间:2010-11-24 19:42:49

标签: wpf silverlight binding combobox itemssource

重新申请的步骤:

当应用程序启动时,打开组合框以生成项目。现在点击“Click Me!”按钮。在后面的代码中,组合框的itemssource被更改。现在尝试再次打开组合框。即使绑定集合中只有2个项目,组合框也会冻结至少5秒钟。这只是一个测试应用程序。在我的实际应用中,有两个以上的项目,滞后是无法忍受的。我试过这个虚拟化开关。没有区别。

花了这么长时间?我该如何解决?如果没有直接修复,是否有解决方法?

XAML:

    <StackPanel>
        <ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
        <Button Content="Click Me!" Click="btn_Click"></Button>
    </StackPanel>

CODE:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "jdkf", Junk2 = "fjdfkasjd;klfj" },
        new Junk() { Junk1 = "jfdk;a", Junk2 = "fjkdljf" } };

    ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "fjkdfhsdjk", Junk2 = "fdjkah;" },
        new Junk() { Junk1="", Junk2 = "asdfj" } };

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.cbo.ItemsSource = junk1;
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        if (this.cbo.ItemsSource == junk1)
            this.cbo.ItemsSource = junk2;
        else
            this.cbo.ItemsSource = junk1;
        this.cbo.UpdateLayout();
    }
}

public class Junk
{
    public string Junk1 { get; set; }
    public string Junk2 { get; set; }
}

5 个答案:

答案 0 :(得分:1)

看起来这是由调试器处理的大量第一次机会异常引起的。有关MS forums的更长解释,请参阅接受的答案。如果单独运行,相同的构建不会显示任何明显的延迟。

答案 1 :(得分:0)

myermian - 没有其他活动有线。这是整个应用程序。没有其他代码可以获得冻结行为。

Aaron - Junk只是一个标准类。它不是来自任何东西。我试过保留集合,调用.Clear()方法,然后添加新项。我得到完全相同的行为。

AnthonyWJones - 这个错误发生在WPF中。我没有在Silverlight中尝试过。对不起,感到困惑。

答案 2 :(得分:0)

我已完全复制了您的代码,并且按预期运行完美 - 所以我建议您的环境可能有问题。

注意:您不需要调用this.cbo.UpdateLayout();,因为ItemsSource是一个依赖项属性,并会在更改时自动更新控件。

答案 3 :(得分:0)

这个问题也发布在这里:

What is causing my WPF combobox items to take so long to refresh when the itemssource is changed?

让我们继续讨论; - )

答案 4 :(得分:0)

此问题在Microsoft已知,并将在4.5中修复。如果没有Visual Studio(通过双击.exe),问题就不会出现。

https://connect.microsoft.com/VisualStudio/feedback/details/633826/combobox-isdropdownopen-true-causes-app-to-lock-up