2009-04-28 6 views
1

J'ai deux zones de liste déroulante sur une page SL. Lorsque Combo 1 est mis à jour, un service est appelé et remplit Combo 2.Silverlight combobox nombre d'éléments affichés refresh

Lors du premier appel, 3 résultats sont renvoyés. Lorsque la zone de liste déroulante est développée, vous pouvez voir les 3 options.

Lors du deuxième appel, 4 résultats sont renvoyés. Lorsque la zone de liste déroulante est développée, vous pouvez voir 3 options, avec une barre de défilement verticale.

Si je recharge et fais ces étapes à l'envers, je reçois 4 lignes le premier appel et 3 lignes + une ligne vide sur le deuxième appel. (Non, le blanc n'est pas un enregistrement, il ne peut pas être sélectionné.)

Il semble que la taille de la liste déroulante conserve la première hauteur générée.

Comment puis-je actualiser les éléments de liste déroulante maximale affichés après chaque appel de service?

Merci!

Edit # 1

Le code suit le modèle M-V-VM. Lorsque la page se charge, le Group1 remplit la première zone de liste déroulante et rien n'est sélectionné. Lorsque l'utilisateur effectue une sélection, cette sélection est liée à Group1Selection.

<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" /> 
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" /> 

Dans le viewmodel, dans le accesseur ensemble de la propriété Group1Selection, j'ai quelque chose comme

set 
{ 
    if (group1Selection != value) 
    { 
     group1Selection = value; 
     PopulateGroup2(); 
     OnPropertyChanged("Group1Selection"); 
    } 
} 

Où PopulateGroup2 effectue mon appel de service async, récupère les données, et met ces données dans l'exposé propriété de Group2.

Dans des conditions "normales", ce n'est pas un problème, puisque la plupart des options ont des dizaines de sélections possibles. Cependant, quelques-uns des choix Group1 ont seulement 3 ou 4 choix d'enfants. Si l'un d'entre eux est sélectionné en premier, alors la hauteur de la zone de liste déroulante, pour le reste de cette instance d'application, est définie sur 3 ou 4, respectivement, au lieu de dépasser 8 éléments affichés. En suivant le modèle M-V-VM, il n'y a pas de code dans le code-behind.

+0

Utilisez-vous la liaison de données dans votre zone de liste déroulante 2 ItemsSource? A quoi ressemble le XAML? –

+0

Si vous n'utilisez pas la liaison de données, à quoi ressemble le code? –

Répondre

4

Ceci est un bug connu dans la ComboBox dans Silverlight 2. Je pense qu'il a été corrigé dans SL 3.

Vous pouvez résoudre ce problème en procédant comme suit:

  1. Hériter de la zone de liste déroulante

    public class MyComboBox: ComboBox

  2. Obtenez une référence à la partie "Popup" du ComboBox à l'intérieur de la méthode OnApplyTemplate()

    Popup thePopup = GetTemplateChild("Popup") as Popup; 
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement; 
    
  3. Remplacer la méthode OnItemsChanged

  4. Dans la méthode OnItemsChagned substituée réinitialiser la hauteur & propriétés de dépendance largeur dans la fenêtre contextuelle en utilisant la méthode ClearValue (DP).

     thePopupContent.ClearValue(FrameworkElement.WidthProperty); 
         thePopupContent.ClearValue(FrameworkElement.HeightProperty); 
    

Vous pouvez effacer Max et Min Hauteur & Width si vous êtes inquiet au sujet de ceux aussi.

+0

Douleur totale - mais beaucoup mieux que l'alternative de détruire la combobox et d'en ajouter une nouvelle aux enfants. –

+0

C'est la meilleure solution à ce problème que j'ai vu. Merci! –

+0

Ouais, je suis totalement d'accord ... mais tu dois faire ce que tu dois faire: o) SL2, je t'aime, mais je ne peux pas attendre SL3 à RTM! – markti

0

Je pense que le problème est que Silverlight ne réalise pas complètement que les données derrière ComboBox 2 ont changé. Peut-être essayer d'ajouter OnPropertyChanged("Group2") à l'ensemble des Group1 - qui devrait aider Silverlight à se rendre compte qu'il a besoin de mettre à jour les liaisons pour ComboBox 2.

Il pourrait également aider à appeler OnPropertyChanged pour Group2Selection, puisque la valeur précédente n'est plus valide.

2

C'était une solution parfaite. Merci markti.

Pour les personnes intéressées de la classe ressemblerait à ceci:

using System.Windows.Controls.Primitives; 

public class WorkAroundComboBox: ComboBox 
{ 
    FrameworkElement thePopupContent; 

    public override void OnApplyTemplate() 
    { 
     Popup thePopup = GetTemplateChild("Popup") as Popup; 
     thePopupContent = thePopup.Child as FrameworkElement; 
     base.OnApplyTemplate(); 
    } 

    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     thePopupContent.ClearValue(FrameworkElement.WidthProperty); 
     thePopupContent.ClearValue(FrameworkElement.HeightProperty); 
     base.OnItemsChanged(e); 
    } 
} 

}