Il numero degli elementi visualizzati nella casella combinata Silverlight viene aggiornato
-
18-09-2019 - |
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.
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:
Eredita dal ComboBox
classe pubblica MyComboBox:Casella combinata
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;
Eseguire l'override del metodo OnItemsChanged
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.