2010-11-24 75 views
1

重新編碼的步驟:爲什麼我的combobox在itemssource更改時會凍結?

當應用程序啓動時,打開組合框,以便生成項目。現在點擊「Click Me!」按鈕。在後面的代碼中,組合框的itemssource被改變。現在嘗試再次打開組合框。即使綁定集合中只有2個項目,組合框也會凍結至少5秒。這只是一個測試應用程序。在我的實際應用中,有超過2個項目,滯後是無法忍受的。我已經通過虛擬化開啓和關閉了。沒什麼區別。

需要這麼長時間?我該如何解決?如果沒有直接的解決方法,是否有解決方法?

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; } 
} 
+0

你有,當你點擊這個組合框(而不是當你加載它)是可以發射過任何其他活動。 – 2010-11-24 19:45:43

+0

爲什麼要改變ItemsSource而不是改變ObservableCollection本身的項目?此外,垃圾不是從任何UI表示正確派生的?這只是一個標準的課程? – 2010-11-24 19:55:11

回答

0

myermian - 沒有其他事件接線。這是整個應用程序。沒有其他代碼需要獲得凍結行爲。

亞倫 - 垃圾只是一個標準的類。它不是來自任何東西。我試着保存集合,調用.Clear()方法,然後添加新項目。我得到完全相同的行爲。

AnthonyWJones - 該錯誤在WPF中。我沒有在Silverlight中嘗試過。對困惑感到抱歉。

0

我已經完全複製了您的代碼,並且它按預期完美運行 - 所以我建議您的環境可能有問題。

注意:您不需要撥打this.cbo.UpdateLayout();作爲ItemsSource是依賴項屬性,並且會在更改時自動更新控件。

1

看起來這是由噸首次機會異常調試器正在處理造成的。更多的解釋在MS forums,請參閱接受的答案。如果單獨運行,相同的版本不會顯示任何明顯的延遲。

相關問題