Silverlight Combobox количество отображаемых элементов обновить - PullRequest
1 голос
/ 28 апреля 2009

У меня есть два поля со списком на странице SL. Когда Combo 1 обновляется, вызывается служба и заполняет Combo 2.

При первом вызове возвращается 3 результата. Когда поле со списком развернуто, вы можете увидеть все 3 варианта.

При втором вызове возвращается 4 результата. Когда поле со списком развернуто, вы можете увидеть 3 варианта с вертикальной полосой прокрутки.

Если я перезагружаюсь и выполняю эти шаги в обратном порядке, я получаю 4 строки при первом вызове и 3 строки + пустую строку при втором вызове. (Нет, пробел не является записью. Его нельзя выбрать.)

Похоже, что размер выпадающего списка сохраняет первую сгенерированную высоту.

Как я могу обновить максимум элементов комбинированного списка, отображаемых после каждого вызова службы?

Спасибо!

Редактировать # 1

Код соответствует шаблону M-V-VM. Когда страница загружается, Group1 заполняет первое поле со списком, и ничего не выбирается. Когда пользователь делает выбор, этот выбор привязывается к Group1Selection.

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

В viewmodel, в наборе доступа set свойства Group1Selection, у меня есть что-то вроде

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

Когда PopulateGroup2 выполняет мой асинхронный вызов службы, получает данные и помещает эти данные в открытое свойство Group2.

В «нормальных» условиях это не проблема, так как большинство опций имеют десятки возможных вариантов выбора. Однако пара вариантов Group1 имеет только 3 или 4 дочерних варианта. Если сначала выбрать один из них, то высота ComboBox для остальной части этого экземпляра приложения будет установлена ​​соответственно на 3 или 4 вместо максимального значения для 8 показанных элементов.

В соответствии с шаблоном M-V-VM в коде нет кода.

Ответы [ 3 ]

4 голосов
/ 01 мая 2009

Это известная ошибка в ComboBox в Silverlight 2. Я думаю, что она была исправлена ​​в SL 3.

Это можно исправить, выполнив следующие действия:

  1. Наследование от ComboBox

    открытый класс MyComboBox: ComboBox

  2. Получить ссылку на «всплывающую» часть ComboBox внутри метода OnApplyTemplate ()

        Popup thePopup = GetTemplateChild("Popup") as Popup;
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
    
  3. Переопределить метод OnItemsChanged

  4. Внутри переопределенного метода OnItemsChagned сбросьте свойства зависимости высоты и ширины всплывающего окна с помощью метода ClearValue (DP).

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

Вы можете очистить свойства Max и Min Height & Width, если вы тоже беспокоитесь о них.

2 голосов
/ 05 мая 2009

Это было идеальное решение. Спасибо, Маркти.

Для интересующихся класс будет выглядеть так:

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

}

0 голосов
/ 30 апреля 2009

Я думаю, что проблема в том, что Silverlight не полностью осознает, что данные, лежащие в основе ComboBox 2, изменились. Возможно, попробуйте добавить OnPropertyChanged("Group2") в набор для Group1 - это должно помочь Silverlight понять, что ему необходимо обновить привязки для ComboBox 2.

Также может помочь вызов OnPropertyChanged для Group2Selection, поскольку предыдущее значение больше не действует.

...