atualização número combobox Silverlight de itens mostrados
-
18-09-2019 - |
Pergunta
Eu tenho duas caixas de combinação em uma página SL. Quando Combo 1 atualizações, um serviço é chamado e preenche Combo 2.
Na primeira chamada, 3 resultados são retornados. Quando a caixa de combinação é expandida, você pode ver todas as 3 opções.
Na segunda chamada, 4 resultados são retornados. Quando a caixa de combinação é expandida, você pode ver 3 opções, com uma barra de rolagem vertical.
Se eu recarregar e fazer esses passos na ordem inversa, recebo 4 linhas a primeira chamada e 3 linhas + uma linha em branco na segunda chamada. (Não, o branco não é um recorde. Ele não pode ser selecionado.)
Parece que o drop down tamanho da lista mantém a altura primeiro gerado.
Como posso atualizar os itens max caixa de combinação mostrados após cada chamada de serviço?
Obrigado!
Edit # 1
O código segue o padrão de H-V-VM. Quando a página é carregada, o Group1
preenche primeira caixa de combinação, e nada está selecionado. Quando o usuário faz uma seleção, que a seleção é obrigado a Group1Selection.
<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" />
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" />
No viewmodel, no set acessador da propriedade Group1Selection
, eu tenho algo parecido
set
{
if (group1Selection != value)
{
group1Selection = value;
PopulateGroup2();
OnPropertyChanged("Group1Selection");
}
}
Onde PopulateGroup2 executa o meu serviço de chamada assíncrona, obtém os dados e coloca os dados em propriedade exposta do Group2
.
Em condições "normais", isso não é um problema, já que a maioria das opções têm dezenas de seleções possíveis. No entanto, um par das escolhas Group1
só tem 3 ou 4 opções criança. Se um dos que é seleccionado em primeiro lugar, em seguida, a altura da caixa de combinação, para o resto da referida instância de aplicação está definido para 3 ou 4, respectivamente, em vez de no máximo em 8 itens mostrados.
Seguindo o padrão de H-V-VM, não existe nenhum código no código subjacente.
Solução
Este é um bug conhecido no ComboBox no Silverlight 2. Eu acho que foi corrigido no SL 3.
Você pode corrigir isso fazendo o seguinte:
-
Inherit do ComboBox
MyComboBox classe pública: ComboBox
-
Obter uma referência para a parte "pop-up" da caixa de combinação no interior da OnApplyTemplate () método
Popup thePopup = GetTemplateChild("Popup") as Popup; FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
-
Substitua o método OnItemsChanged
-
Dentro do método OnItemsChagned substituído repor a altura e largura propriedades de dependência no Popup usando o método ClearValue (DP).
thePopupContent.ClearValue(FrameworkElement.WidthProperty); thePopupContent.ClearValue(FrameworkElement.HeightProperty);
Você pode limpar as propriedades Max e Min Altura e Largura se você está preocupado com os demais.
Outras dicas
Essa foi uma solução perfeita. Obrigado markti.
Para os interessados ??a classe ficaria assim:
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);
}
}
}
Eu acho que o problema é que o Silverlight não compreender plenamente que os dados por trás ComboBox 2 mudou. Talvez tente adicionar OnPropertyChanged("Group2")
ao conjunto de Group1
-. Que deve ajudar Silverlight para perceber que necessita de actualizar as ligações para ComboBox 2
Ele também pode ajudar a chamar OnPropertyChanged
para Group2Selection
, uma vez que o valor anterior não é mais válido.