He estado luchando contra un ComboBox "lento" de WPF esta mañana, y me encantaría ver si alguien tiene consejos para eliminar este problema.Diagnóstico de problemas de rendimiento con WPF de datos ComboBox
Digamos que tengo dos ComboBoxes, A y B. Cuando A cambia, los elementos en B también cambian. El ComboBoxes cada uno tiene su enlace de datos y SelectedItem ItemsSource así:
<ComboBox Grid.Column="1" ItemsSource="{Binding Names}" SelectedItem="{Binding CurrentName, Mode=TwoWay}" Margin="3" MinWidth="100" />
<ComboBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding SubNames}" SelectedItem="{Binding CurrentSubName, Mode=TwoWay}" Margin="3" MinWidth="100" />
Cada vez que la lista de B tiene que cambiar, lo hago en la limpieza de subnombres y luego volver a agregar las entradas en base a la SelectedItem en A. Esto es hecho porque sobrescribir SubNames con un nuevo ObservableCollection<string>
rompe el enlace de datos.
Todo en una computadora funciona como usted espera. Seleccione A, luego haga clic en B y los nuevos elementos aparecerán inmediatamente. En otra computadora, cuando hago esto, hay una pausa de hasta 5 segundos antes de que se muestre el ComboBox. La cantidad de artículos es exactamente la misma. Una diferencia es que en la máquina lenta, hay cosas sucediendo en el fondo con la comunicación de hardware. Congelé todos esos hilos y no ayudó.
Mi mayor problema es que no puedo averiguar por dónde empezar a buscar. Necesito ver qué está haciendo el sistema en el momento en que se hace clic en el ComboBox. Estoy usando databinding, por lo que no puedo poner un punto de interrupción en ningún lado. Traté de cambiar mi declaración de subnombres de
public ObservableCollection<string> SubNames { get; set; }
a
private ObservableCollection<string> subnames_ = new ObservableCollection<string>();
public ObservableCollection<string> SubNames
{
get { return subnames_; }
set { subnames_ = value; }
}
y luego poner puntos de interrupción en el getter y setter para ver si había lectura excesiva o la escritura pasando, pero no estaba' t cualquier.
¿Alguien puede sugerirme un próximo paso para intentar determinar el origen de esta ralentización? No creo que tenga nada que ver con la plantilla de stock de ComboBox, como se describe en in this article.
¿Puede verificar que sigue siendo así cuando lo ejecuta fuera de una sesión de depuración? – ArielBH
¡Me olvidé por completo de esta pregunta! Encontré una publicación en algún lugar que sugería que solo ocurre dentro del depurador, y efectivamente, ese era el caso. Pero desde entonces he cambiado el código para usar ICollectionView para todo, y creo que ahora es bastante rápido incluso dentro del depurador. – Dave
Me salvaste horas de depuración. Yo uso CollectionViewSource (y List) y en la depuración tarda 3-4sec. para abrir un ComboBox después de establecer ItemsSource, pero fuera del depurador funciona mucho más rápido. Gracias por señalar eso. –
surfen