Domanda

Ho due caselle combinate su una pagina SL.Quando Combo 1 si aggiorna, viene chiamato un servizio e popola Combo 2.

Alla prima chiamata vengono restituiti 3 risultati.Quando la casella combinata viene espansa, puoi vedere tutte e 3 le opzioni.

Alla seconda chiamata vengono restituiti 4 risultati.Quando la casella combinata viene espansa, puoi vedere 3 opzioni, con una barra di scorrimento verticale.

Se ricarico ed eseguo questi passaggi al contrario, ottengo 4 righe la prima chiamata e 3 righe + una riga vuota nella seconda chiamata.(No, lo spazio vuoto non è un record.Non può essere selezionato.)

Sembra che la dimensione dell'elenco a discesa mantenga la prima altezza generata.

Come posso aggiornare il numero massimo di elementi della casella combinata mostrati dopo ogni chiamata di servizio?

Grazie!

Modifica n. 1

Il codice segue lo schema M-V-VM.Quando la pagina viene caricata, il file Group1 popola la prima casella combinata e non viene selezionato nulla.Quando l'utente effettua una selezione, tale selezione è associata a Group1Selection.

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

Nel viewmodel, nella funzione di accesso set di Group1Selection proprietà, ho qualcosa di simile

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

Dove PopulateGroup2 esegue la mia chiamata di servizio asincrona, ottiene i dati e li inserisce nella proprietà esposta di Group2.

In condizioni "normali", questo non è un problema, poiché la maggior parte delle opzioni ha dozzine di selezioni possibili.Tuttavia, un paio di Group1 le scelte hanno solo 3 o 4 scelte figlie.Se uno di questi viene selezionato per primo, l'altezza del ComboBox per il resto dell'istanza dell'applicazione viene impostata rispettivamente su 3 o 4, invece di raggiungere il limite massimo di 8 elementi visualizzati.

Seguendo il modello M-V-VM, non è presente codice nel code-behind.

È stato utile?

Soluzione

Si tratta di un bug noto nel ComboBox di Silverlight 2.Penso che sia stato risolto in SL 3.

Puoi risolvere questo problema procedendo come segue:

  1. Eredita dal ComboBox

    classe pubblica MyComboBox:Casella combinata

  2. Ottieni un riferimento alla parte "Popup" del ComboBox all'interno del metodo OnApplyTemplate()

        Popup thePopup = GetTemplateChild("Popup") as Popup;
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
    
  3. Eseguire l'override del metodo OnItemsChanged

  4. All'interno del metodo OnItemsChagned sottoposto a override reimpostare le proprietà di dipendenza Altezza e Larghezza nel popup utilizzando il metodo ClearValue(DP).

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

Puoi cancellare le proprietà Altezza e larghezza massima e minima se sei preoccupato anche per quelle.

Altri suggerimenti

E 'stata una soluzione perfetta. Grazie markti.

Per chi fosse interessato la classe sarebbe simile a questa:

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

}

Credo che il problema è che Silverlight non si rende conto pienamente che i dati dietro ComboBox 2 è cambiato. Forse provare ad aggiungere OnPropertyChanged("Group2") al set per Group1 -. Che dovrebbe aiutare Silverlight per rendersi conto che ha bisogno di aggiornare le associazioni per ComboBox 2

Si potrebbe anche aiutare a chiamare OnPropertyChanged per Group2Selection, dal momento che il valore precedente non è più valido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top