精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。
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}"
里面有很多细节原理,如果想深入掌握,请联系锐英源。只知道应用,不知道细节,遇到问题时会束手无策,基础好才能更好发展。