精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。
CheckComboBox扩展了ComboBox,能够在每个项前面加上打勾的复选框,每个项的复选框表示项是否被选择上,这样就有了多个选择项自动显示的问题,因为普通的ComboBox只能显示一个选择结果,多个项选择上后自动显示UI如下图:
这效果在HandyControl自带的代码没有,没有的状态是高温和噪声位置窗口里是空白的,用户使用起来非常不友好。
需要四个步骤扩充,现在把步骤介绍下:
1、在ViewModel里准备List形式的SelectedItems。
2、把下面自定义类添加到项目里:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HandyControl.Controls; using System.Collections; using System.Windows; using System.Windows.Controls; namespace ZrClient.MyControl.Controls { public class CheckComboBoxHelper: DependencyObject { public static IList GetSelectedItems(DependencyObject obj) { return (IList)obj.GetValue(SelectedItemsProperty); } public static void SetSelectedItems(DependencyObject obj, int value) { obj.SetValue(SelectedItemsProperty, value); } public string SelectedItems { get { return (string)GetValue(SelectedItemsProperty); } set { SetValue(SelectedItemsProperty, value); } } public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached("SelectedItems", typeof(IEnumerable), typeof(CheckComboBoxHelper), new PropertyMetadata(null, OnSelectedItemsChanged)); private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is CheckComboBox cbox) { if (e.OldValue != null) { cbox.SelectionChanged -= OnSelectionChanged; } if (e.NewValue is IList list) { cbox.SelectedItems.Clear(); if (list != null) { foreach (var item in list) { cbox.SelectedItems.Add(item); } cbox.OnApplyTemplate(); cbox.SelectionChanged += OnSelectionChanged; } } } } private static void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { var dataSource = GetSelectedItems(sender as DependencyObject); // 添加用户选中的项 foreach (var item in e.AddedItems) { if(dataSource.IndexOf(item) == -1) dataSource.Add(item); } // 删除用户取消选中的项 foreach (var item in e.RemovedItems) { if(dataSource.IndexOf(item)>=0) dataSource.Remove(item); } } } }
3、在View xaml文件里开头添加如下行:
xmlns:zxc="clr-namespace:ZrClient.MyControl.Controls"
4、在CheckComboBox的属性里添加如下行:
zxc:CheckComboBoxHelper.SelectedItems="{Binding lstSelsafetype}"
里面有很多细节原理,如果想深入掌握,请联系锐英源。只知道应用,不知道细节,遇到问题时会束手无策,基础好才能更好发展。