我有一個數據網格(稱爲dat1),它有一個項目源綁定到一個自定義類型的可觀察集合,稱之爲TypeA。 TypeA上的其中一個屬性是另一個自定義類型的可觀察集合,稱爲TypeB。然後我有一個組合框,綁定到dat1的SelectedItem.TypeB。什麼是導致我的WPF組合框項目花費這麼長時間來刷新itemssource時更改?
因此,當用戶在dat1中選擇TypeA時,組合框將顯示來自所選TypeA的TypeB可觀察集合中的項目。合理?
該綁定能工作,它會更新。問題是,當組合框中的項目演示者已經顯示項目並且用戶在dat1中選擇了不同的TypeA並嘗試查看組合框中的新項目時,項目演示者生成新項目時會有很長的暫停。
爲了測試這個問題,我可以簡化這個場景。
重現步驟:
創建使用.NET 4.0一個新的WPF項目。
剪下並粘貼下面的代碼。
要獲得凍結行爲,必須放下組合框以查看項目,然後單擊該按鈕,以便項目源更改,然後再次放下組合框。幾秒鐘後組合框下降,但爲什麼這麼慢?
XAML
<Window x:Class="ComboBoxTest.MainWindow"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
<Button Content="Click Me!" Click="btn_Click"></Button>
</StackPanel>
</Grid>
</Window>
代碼
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.cbo.ItemsSource = junk1;
}
ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "junk1 - 1" },
new Junk() { Junk1 = "junk1 - 2" } };
ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "junk2 - 1" },
new Junk() { Junk1 = "junk2 - 2" },
new Junk() { Junk1 = "junk2 - 3" },
new Junk() { Junk1 = "junk2 - 4" } };
private void btn_Click(object sender, RoutedEventArgs e)
{
if (this.cbo.ItemsSource == junk1)
this.cbo.ItemsSource = junk2;
else
this.cbo.ItemsSource = junk1;
}
}
public class Junk
{
public string Junk1 { get; set; }
}
注意:這是一個WPF問題。我聽說Silverlight沒有相同的問題。我不需要知道Silverlight是否有效。我需要一個WPF答案。
PS。當項目源更改爲junk2時,延遲時間會更長,可能是因爲它較大。
它足夠延遲,我認爲它可能是由綁定異常引起的,因爲異常需要時間。有沒有辦法查看是否存在綁定異常?
你應該看到在VS IDE輸出窗口綁定例外,而調試。 – VoodooChild 2010-12-10 02:13:10
我沒有看到您發佈的代碼有太長時間的停頓。 – lesscode 2010-12-10 02:25:16