原生C1ComboBox控件非常强大且使用,如支持自动完成、下拉单选、下拉方向、下拉框可定义大小等。
但未支持多选:如点击下拉可出现CheckList,以方便用户多选。如下图所示的需求:
虽不直接支持,然既然基于WPF,故提供了模板供我们扩展的接口:Templates、http://helpcentral.componentone.com/nethelp/C1BasicWPF/#!Documents/C1ComboBox/itemtemplates2.htm
下面我们开始定义可下拉多选的C1Combox:
首先,定义Node用于存储选择数据,有2个属性:Title、IsSelected, 为了可绑定要继承,必须从INotifyPropertyChanged接口继承。
1: public class Node : INotifyPropertyChanged2: {3: ...4: public string Title5: {6: get
7: {8: return _title;
9: }10: set
11: {12: _title = value;13: NotifyPropertyChanged("Title");
14: }15: }16: public bool IsSelected
17: {18: get
19: {20: return _isSelected;
21: }22: set
23: {24: _isSelected = value;25: NotifyPropertyChanged("IsSelected");
26: }27: }28: ...29: }
然后,定义ViewModel,用于存储下拉列表的多个Node。
最后,定义主角:MultiSelectComboBox类
它继承自C1.WPF.C1ComboBox,我们重写OnItemsSourceChanged、http://helpcentral.componentone.com/nethelp/C1BasicWPF/#!XMLDocuments/Ref/html/M_C1_WPF_C1ComboBox_OnApplyTemplate.htm,并新增了依赖属性DependencyProperty SelectedItemsProperty用于输出选择的下拉项。
OnItemsSourceChanged: 初始化Node列表。
http://helpcentral.componentone.com/nethelp/C1BasicWPF/#!XMLDocuments/Ref/html/M_C1_WPF_C1ComboBox_OnApplyTemplate.htm: 获得C1Combox的子元素“ComboHeader”、“DropDown”,注册点击、选择事件
SelectedItems: 选择项变化后,逐个判断Node节点,设置IsSelected属性,同时在C1Combox上当前选择的项的Title字符串,多个项用逗号分隔。
调用方法,在XMAL中添加调用即可:
1: <local:MultiSelectComboBox x:Name="multiSelectCombo1" Height="23" Width="150"2: ItemsSource="{Binding Path=Items}"
3: SelectedItems="{Binding SelectedItems, Mode=TwoWay}">
4: <c1:C1ComboBox.ItemTemplate>5: <DataTemplate>6: <CheckBox Name="templateCheckbox"
7: Content="{Binding Title}"
8: IsChecked="{Binding IsSelected}"
9: Checked="templateCheckbox_Checked"
10: Unchecked="templateCheckbox_UnChecked"
11: />12: </DataTemplate>13: </c1:C1ComboBox.ItemTemplate>14: </local:MultiSelectComboBox>
源码下载: