Обновление числа отображаемых элементов в поле со списком Silverlight
-
18-09-2019 - |
Вопрос
У меня есть два поля со списком на странице 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.
Вы можете исправить это, выполнив следующие действия:
Наследовать от ComboBox
общедоступный класс MyComboBox:Поле со списком
Получите ссылку на часть «Всплывающее окно» ComboBox внутри метода OnApplyTemplate().
Popup thePopup = GetTemplateChild("Popup") as Popup; FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
Переопределить метод OnItemsChanged
Внутри переопределенного метода 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
, поскольку предыдущее значение больше не действительно.