J'ai une grille de données (appelez-la dat1) qui a une source d'éléments liée à une collection observable d'un type personnalisé, appelez-la TypeA. L'une des propriétés de TypeA est une collection observable d'un autre type personnalisé, appelez-la TypeB. J'ai alors une liste déroulante avec une source d'éléments liée à SelectedItem.TypeB de dat1. Par conséquent, lorsque l'utilisateur sélectionne un TypeA dans dat1, la zone de liste déroulante affiche les éléments de la collection observable TypeB provenant du type A sélectionné. Avoir du sens?Qu'est-ce qui cause que mes éléments de liste déroulante WPF prennent tellement de temps à s'actualiser lorsque la source d'éléments est modifiée?
La liaison fonctionne et elle est mise à jour. Le problème est que lorsque le présentateur d'éléments dans la liste déroulante a déjà affiché des éléments et que l'utilisateur sélectionne un TypeA différent dans dat1 et tente d'afficher les nouveaux éléments dans la liste déroulante, il y a une longue pause pendant que le présentateur génère les nouveaux éléments.
Pour tester le problème, je peux simplifier le scénario.
Étapes pour reproduire:
Créer un nouveau projet WPF en utilisant .NET 4.0.
Coupez et collez le code ci-dessous. Pour obtenir le comportement de congélation, vous devez supprimer la liste déroulante pour voir les éléments, puis cliquez sur le bouton pour modifier la source des éléments, puis relâchez la liste déroulante. La combobox tombe après quelques secondes, mais pourquoi si lent?
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>
code
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; }
}
NOTE: Ceci est un problème WPF. J'ai entendu dire que Silverlight n'a pas le même problème. Je n'ai pas besoin de savoir si Silverlight fonctionne. J'ai besoin d'une réponse WPF.
PS. Le délai est plus long lorsque la source des éléments est modifiée en indésirable2, vraisemblablement parce qu'elle est plus grande.
Cela retarde assez que je pense qu'il peut être provoqué par des exceptions de liaison, puisque les exceptions prennent du temps. Existe-t-il un moyen de voir si des exceptions obligatoires sont levées?
Vous devriez voir les exceptions de liaison dans la fenêtre de sortie dans VS IDE, pendant le débogage. – VoodooChild
Je ne vois pas de longue pause avec le code que vous avez posté. – lesscode
De même ici, il semble n'y avoir aucune hésitation. –