Обновление числа отображаемых элементов в поле со списком Silverlight

StackOverflow https://stackoverflow.com/questions/799403

Вопрос

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

При первом вызове возвращаются 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}" />

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

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

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

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

Следуя шаблону M-V-VM, в выделенном коде нет кода.

Это было полезно?

Решение

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

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

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

    общедоступный класс MyComboBox:Поле со списком

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

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

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

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

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

Другие советы

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

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

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

}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top