锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / HandyControl / HandyControl的CheckComboBox多选结果SelectedItems自动显示
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。

HandyControl的CheckComboBox多选结果SelectedItems自动显示


CheckComboBox扩展了ComboBox,能够在每个项前面加上打勾的复选框,每个项的复选框表示项是否被选择上,这样就有了多个选择项自动显示的问题,因为普通的ComboBox只能显示一个选择结果,多个项选择上后自动显示UI如下图:

checkcombobox多选

这效果在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}"                  
              

里面有很多细节原理,如果想深入掌握,请联系锐英源。只知道应用,不知道细节,遇到问题时会束手无策,基础好才能更好发展。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内