Question

J'ai deux boîtes combo sur une page SL. Lorsque les mises à jour Combo 1, un service est appelé et Combo 2. remplit

Au premier appel, 3 résultats sont retournés. Lorsque la zone de liste déroulante est étendue, vous pouvez voir les 3 options.

Au deuxième appel, 4 résultats sont retournés. Lorsque la zone de liste déroulante est étendue, vous pouvez voir 3 options, avec une barre de défilement vertical.

Si je fais et recharger ces étapes en sens inverse, je reçois 4 lignes le premier appel et 3 lignes + une ligne vide sur le deuxième appel. (Non, le blanc est pas un record. Il ne peut pas être sélectionné.)

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

Comment puis-je rafraîchir la boîte combo éléments max 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, la première Group1 Remplit la zone de liste déroulante, et rien est sélectionné. Lorsque l'utilisateur effectue une sélection, que la 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 la propriété exposée Group2.

Dans des conditions « normales », ce n'est pas un problème, car la plupart des options ont des dizaines de sélections possibles. Cependant, deux des choix de Group1 ont seulement 3 ou 4 choix de l'enfant. Si l'un de ceux qui est sélectionnée en premier, puis la hauteur de la zone de liste déroulante, pour le reste de cette instance d'application est fixé à 3 ou 4, respectivement, au lieu de plafonnait à 8 éléments affichés.

Suivant le modèle M-V-VM, il n'y a pas de code dans le code sous-jacent.

Était-ce utile?

La solution

Ceci est un bug connu dans la zone de liste déroulante dans Silverlight 2. Je pense que son été fixé 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. Obtenir une référence à la "popup" une partie de la zone de liste déroulante à 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 de substitution OnItemsChagned réinitialiser les propriétés de dépendance Hauteur et largeur dans la fenêtre contextuelle en utilisant la méthode ClearValue (DP).

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

Vous pouvez effacer les propriétés de hauteur et largeur Max et Min si vous êtes inquiet au sujet de ceux qui sont trop.

Autres conseils

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);
    }
}

}

Je pense que le problème est que Silverlight ne se rend pas compte pleinement que les données sous-jacentes ComboBox 2 a changé. Peut-être essayer d'ajouter à l'ensemble OnPropertyChanged("Group2") pour 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top