Не удалось установить начальные состояния выбранных элементов в 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.

Надеюсь, что эта помощь вам поможет.