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.

Foi útil?

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:

  1. Inherit do ComboBox

    MyComboBox classe pública: ComboBox

  2. 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;
    
  3. Substitua o método OnItemsChanged

  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top