我正在尝试使用Xceed CheckComboBox,它运行良好,除了一个小问题。最初加载 CheckComboBox 时,所选项目列表会正确显示在 CheckComboBox 的 ToggleButton 部分中,但不会选中代表这些项目的复选框。这是我正在使用的代码
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());
}
}
我想知道为什么当在 View 模型中正确设置 SelectedFacilities 时,CheckComboBox 的复选框不会根据 SelectedFacilities 中的项目进行选中。有趣的是,CheckComboBox 的切换按钮部分正确地以逗号分隔列表显示 SelectedFacilities。
最佳答案
不清楚你怎么填写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
的子集
关于wpf - 无法设置 CheckComboBox 中所选项目的初始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29428291/