WPF中实现多选ComboBox控件

简介: 原文:WPF中实现多选ComboBox控件在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选。 将ComboBox的ItemsSource属性Binding到一个Book的集合, public class Book { ...
原文: WPF中实现多选ComboBox控件

在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选。

将ComboBox的ItemsSource属性Binding到一个Book的集合,

    public class Book
    {
        public string Name { get; set; }
    }
<ComboBox ItemsSource="{Binding Path=Books}">
    <ComboBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:Book}">
            <StackPanel>
                <TextBlock Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

显示效果如下:

为了让ComboBox支持CheckBox,和上面代码一样,修改ComboBox的DataTemplate,CheckBox的选中/非选中状态需要Binding到一个Bool型的Property上面。但是这个Property并不是Book的一个属性,所以新建一个BookEx类,增加一个IsChecked属性

    public class BookEx : ObservableObject
    {
        public Book Book { get; private set; }

        private bool _isChecked;

        public bool IsChecked
        {
            get
            {
                return _isChecked;
            }
            set
            {
                if(_isChecked != value)
                {
                    _isChecked = value;

                    RaisePropertyChanged("IsChecked");
                }
            }
        }

        public BookEx(Book book)
        {
            Book = book;
        }
    }

将ComboBox的ItemsSource属性Binding到BookEx集合上,下面修改ComboBox的DataTemplate:

此时已经可以实现多选了,但是当选择相应的条目后,在ComboBox的Text区域并不显示。下面来解决这个问题。实现方式是将选中的Book的Name属性集合Binding到ComboBox的Text属性上面。对ViewModel做一些改造,增加一个SelectedText属性,用来显示选中的条目Name集合

public ObservableCollection<BookEx> BookExs
{
    get
    {
        if(_books == null)
        {
            _books = new ObservableCollection<BookEx>();

            _books.CollectionChanged += (sender, e) => 
            {
                if(e.OldItems != null)
                {
                    foreach (BookEx bookEx in e.OldItems)
                    {
                        bookEx.PropertyChanged -= ItemPropertyChanged;
                    }
                }

                if(e.NewItems != null)
                {
                    foreach (BookEx bookEx in e.NewItems)
                    {
                        bookEx.PropertyChanged += ItemPropertyChanged;
                    }
                }
            };
        }

        return _books;
    }
}

private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if(e.PropertyName == "IsChecked")
    {
        BookEx bookEx = sender as BookEx;

        if(bookEx != null)
        {
            IEnumerable<BookEx> bookExs = BookExs.Where(b => b.IsChecked == true);

            StringBuilder builder = new StringBuilder();

            foreach (BookEx item in bookExs)
            {
                builder.Append(item.Book.Name + " ");
            }

            SelectedText = builder == null ? string.Empty : builder.ToString();
        }
    }
}

最后一个注意点,修改ComboBox的IsEditable="True",只有这样才能接收Text的Binding。

<ComboBox Text="{Binding SelectedText}" IsEditable="True" ItemsSource="{Binding Path=BookExs}">
    <ComboBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:BookEx}">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked}" />
                <TextBlock Text="{Binding Book.Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

实现的效果如下:

 就这样一个可以多选的ComboBox就实现了。代码点击这里下载。

感谢您的阅读,如果您有其他实现方式,欢迎在评论区域点评,谢谢~

目录
相关文章
|
5月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
5月前
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
133 1
|
5月前
|
C# Windows
WPF中如何使用HandyCotrol控件库
WPF中如何使用HandyCotrol控件库
225 1
|
5月前
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
176 0
|
5月前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
118 0
|
5月前
|
开发框架 前端开发 JavaScript
WPF应用开发之控件动态内容展示
WPF应用开发之控件动态内容展示
|
5月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
|
5月前
|
前端开发 C#
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
200 0
|
5月前
|
开发框架 前端开发 C#
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
|
5月前
|
开发框架 前端开发 JavaScript
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理