再現手順:
アプリが起動したら、アイテムが生成されるようにコンボボックスを開きます。「Click Me!」をクリックします。ボタン。コード ビハインドでは、コンボ ボックスの 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; }
}