Не удалось установить начальные состояния выбранных элементов в CheckComboBox
Я пытаюсь использовать Xceed CheckComboBox, и он работает хорошо, за исключением небольшой проблемы. Когда CheckComboBox изначально загружен, выбранные элементы List отображаются правильно в части ToggleButton CheckComboBox, но флажки, представляющие эти элементы, не проверяются. Вот код, который я использую
XAML
<xctk:CheckComboBox x:Name="_combo" Grid.Row="2" Grid.Column="1"
ItemsSource="{Binding RoomFacilities}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
DisplayMemberPath="FacilityName"
SelectedItemsOverride="{Binding SelectedFaclities}"
/>
Показать модель
public class RoomBandUpdateViewModel : Screen, IHandle<RecordChanged<RoomFacility>>,
IHandle<RecordDeleted<RoomFacility>> {
private ObservableCollection<RoomFacility> _roomFacilities;
public ObservableCollection<RoomFacility> RoomFacilities {
get { return _roomFacilities; }
set { _roomFacilities = value; NotifyOfPropertyChange(() => RoomFacilities); }
}
private ObservableCollection<RoomFacility> _selectedFacilities;
public ObservableCollection<RoomFacility> SelectedFaclities {
get { return _selectedFacilities; }
set { _selectedFacilities = value; NotifyOfPropertyChange(() => SelectedFaclities); }
}
protected override void OnActivate() {
SelectedFaclities = new ObservableCollection<RoomFacility>(RoomBand.Facilities);
RoomFacilities = new ObservableCollection<RoomFacility>(facilityService.GetAll());
}
}
Я хотел бы знать, почему, когда SelectedFacilities правильно установлены в модели вида, флажки CheckComboBox не проверяются в соответствии с элементами в SelectedFacilities. Интересная часть состоит в том, что часть Toggle Button CheckComboBox правильно отображает SelectedFacilities в списке, разделенном запятыми.
Ответы
Ответ 1
Непонятно, как вы заполняете SelectedFacilities
и RoomFacilities
. Убедитесь, что вы правильно справились с эталонным равенством RoomFacility
. Другими словами, единственный способ, которым я мог только воспроизвести проблему, - это заполнить ObservableCollection
следующим шаблоном:
RoomFacilities m1 = new RoomFacilities() { FacilityName = "F1" };
RoomFacilities m2 = new RoomFacilities() { FacilityName = "F2" };
RoomFacilities m3 = new RoomFacilities() { FacilityName = "F3" };
RoomFacilities m4 = new RoomFacilities() { FacilityName = "F1"};
RoomFacilities m5 = new RoomFacilities() { FacilityName = "F2"};
RoomFacilities = new ObservableCollection<RoomFacilities>(new Collection<RoomFacilities>() { m1, m2, m3 });
SelectedFacilities = new ObservableCollection<RoomFacilities>(new Collection<RoomFacilities>() { m4, m5 });
Обратите внимание, что хотя m4
и m5
имеют аналогичный FacilityName
(который отображается в ToggleButton
CheckComboBox
, они не будут выбраны в раскрывающемся списке, Если вы не переопределите Equals
метод:
public override bool Equals(object obj)
{
if (obj is RoomFacilities)
{
RoomFacilities mod = (RoomFacilities)obj;
if (mod.FacilityName == this.FacilityName)
return true;
else
return false;
}
return base.Equals(obj);
}
public override int GetHashCode()
{
return FacilityName.GetHashCode();
}
Другими словами, CheckComboBox
не генерирует исключение, если SelectedItemsOverride
НЕ является подмножеством ItemsSource
Ответ 2
Если вы создаете экземпляр коллекции в конструкторе своего класса, свойство еще не привязано к вашему компоненту, поэтому событие PropertyChanged вашего ViewModel не запускается вашим компонентом.
Наблюдаемый метод Add() коллекции не запускает событие PropertyChanged, но запускает событие CollectionChanged.
Надеюсь, что эта помощь вам поможет.