1

再生步骤:

当应用程序启动时,打开组合框以便生成项目。现在点击“点击我!” 按钮。在后面的代码中,组合框的 itemssource 发生了变化。现在尝试再次打开组合框。即使绑定集合中只有 2 个项目,组合框也会冻结至少 5 秒。这只是一个测试应用程序。在我的实际应用中,有2个以上的项目,并且滞后是难以忍受的。我已经尝试过开启和关闭虚拟化。没什么区别。

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

XAML:

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

代码:

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; }
}
4

2 回答 2

0

myermian - 没有连接其他事件。这是整个应用程序。获得冻结行为不需要其他代码。

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

AnthonyWJones - 错误在 WPF 中。我没有在 Silverlight 中尝试过。对困惑感到抱歉。

于 2010-11-25T02:05:33.207 回答
0

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

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

于 2010-11-25T09:20:05.097 回答