我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于WPF怎么实现简单的下拉筛选控件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于WPF怎么实现简单的下拉筛选控件

本文小编为大家详细介绍“基于WPF怎么实现简单的下拉筛选控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于WPF怎么实现简单的下拉筛选控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

WPF 简单实现下拉筛选控件

框架使用.NET40

Visual Studio 2022;

使用 ICollectionView[2] 实现筛选功能,还支持其他如下:

  • 使集合具有当前记录管理

  • 自定义排序

  • 筛选和分组功能

基于WPF怎么实现简单的下拉筛选控件

实现代码

1)CheckedSearch.cs 代码如下:

  • SearchText 用来记录输入的筛选内容

  • Text 用来记录展示的所选内容^拼接

  • ItemsSource 数据源

  • ContainsFilter 筛选数据,如果从数据源中找到则返回True

using System.Collections.ObjectModel;using System.ComponentModel;using System.Linq;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using WpfCustomControlLibrary1.Datas;namespace WpfCustomControlLibrary1{    public class CheckedSearch : Control    {        private ICollectionView _filteredCollection;        public ICollectionView FilteredCollection { get { return _filteredCollection; } }        private string _searchText = string.Empty;        public string SearchText        {            get { return _searchText; }            set            {                if (_searchText != value)                {                    _searchText = value;                    _filteredCollection.Refresh();                }            }        }        public string Text        {            get { return (string)GetValue(TextProperty); }            set { SetValue(TextProperty, value); }        }        public static readonly DependencyProperty TextProperty =            DependencyProperty.Register("Text", typeof(string), typeof(CheckedSearch), new PropertyMetadata(string.Empty));        public ObservableCollection<CheckedSearchItem> ItemsSource        {            get { return (ObservableCollection<CheckedSearchItem>)GetValue(ItemsSourceProperty); }            set { SetValue(ItemsSourceProperty, value); }        }        public static readonly DependencyProperty ItemsSourceProperty =            DependencyProperty.Register("ItemsSource", typeof(ObservableCollection<CheckedSearchItem>), typeof(CheckedSearch), new PropertyMetadata(null, OnItemsSourceChanged));        private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)        {            var choseSearch = (CheckedSearch)d;            if (choseSearch == null) return;            if (choseSearch._filteredCollection == null && choseSearch.ItemsSource.Count > 0)            {                foreach (var item in choseSearch.ItemsSource)                {                    item.PropertyChanged -= choseSearch.Item_PropertyChanged;                    item.PropertyChanged += choseSearch.Item_PropertyChanged;                }                choseSearch._filteredCollection = CollectionViewSource.GetDefaultView(choseSearch.ItemsSource);                choseSearch._filteredCollection.Filter = choseSearch.ContainsFilter;            }        }        string GetItems()        {            var list = ItemsSource.Where(x=>x.IsChecked).Select(x=>x.Name).ToList();            var visibleItems = string.Join("^",list);            return visibleItems;        }        static CheckedSearch()        {            DefaultStyleKeyProperty.OverrideMetadata(typeof(CheckedSearch), new FrameworkPropertyMetadata(typeof(CheckedSearch)));        }        private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)        {            if (e.PropertyName == "IsChecked")                Text = GetItems();                    }        private bool ContainsFilter(object item)        {            var model = item as CheckedSearchItem;            if (model == null)                return false;            if (string.IsNullOrEmpty(SearchText))                return true;            if (model.Name.ToUpperInvariant().Contains(SearchText.ToUpperInvariant()))                return true;            return false;        }    }}

2)CheckedSearchItem.cs 代码如下:

  • IsChecked 记录是否选中

  • Name 展示的名称

using System.ComponentModel;namespace WpfCustomControlLibrary1.Datas{    public class CheckedSearchItem    {        public string Name { get; set; }        private bool _isChecked;        public bool IsChecked        {            get { return _isChecked; }            set            {                _isChecked = value;                OnPropertyChanged("IsChecked");            }        }                public event PropertyChangedEventHandler PropertyChanged;        protected void OnPropertyChanged(string propertyName)        {            if (PropertyChanged != null)                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));        }    }}

3)CheckedSearch.xaml 代码如下:

<Style TargetType="{x:Type local:CheckedSearch}">        <Setter Property="Height" Value="40"/>        <Setter Property="Width" Value="200"/>        <Setter Property="BorderBrush" Value="DodgerBlue"/>        <Setter Property="Background" Value="White"/>        <Setter Property="BorderThickness" Value="1"/>        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type local:CheckedSearch}">                    <Border Background="{TemplateBinding Background}"                            BorderBrush="{TemplateBinding BorderBrush}"                            BorderThickness="{TemplateBinding BorderThickness}"                            x:Name="PART_Border">                        <Grid>                            <Grid.ColumnDefinitions>                                <ColumnDefinition/>                                <ColumnDefinition Width="Auto"/>                            </Grid.ColumnDefinitions>                            <TextBlock Text="{Binding Text,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                                       Foreground="Black"                                       VerticalAlignment="Center"                                       Margin="2,0"/>                            <ToggleButton x:Name="PART_ToggleButton"            Focusable="False"                                      Width="30"                                      Style="{x:Null}"                                      Grid.Column="1"           ClickMode="Release">                                <Path Stretch="Fill"                                       Height="6" Width="10"                                        HorizontalAlignment="Center"                                       VerticalAlignment="Center"                   Data="M998 352c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z"                                       Fill="Black">                                </Path>                            </ToggleButton>                            <Popup IsOpen="{Binding ElementName=PART_ToggleButton,Path=IsChecked}"                                   x:Name="PART_Popup"                                   VerticalOffset="2"                                   AllowsTransparency="True"        PlacementTarget="{Binding ElementName=PART_Border}"        Placement="Bottom" StaysOpen="False">                                <Border Width="{TemplateBinding Width}"                                        Padding="2,4"                                        Background="{TemplateBinding Background}"                            BorderBrush="{TemplateBinding BorderBrush}"                            BorderThickness="{TemplateBinding BorderThickness}">                                    <StackPanel>                                        <TextBox Text="{Binding SearchText,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                                                 Height="40" VerticalContentAlignment="Center"                                                 Margin="0,0,0,2"/>                                        <ListBox ItemsSource="{TemplateBinding ItemsSource}">                                            <ListBox.ItemTemplate>                                                <DataTemplate>                                                    <CheckBox Content="{Binding Name}"                                                               IsChecked="{Binding IsChecked}"/>                                                </DataTemplate>                                            </ListBox.ItemTemplate>                                        </ListBox>                                    </StackPanel>                                </Border>                                                            </Popup>                        </Grid>                    </Border>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style>

4)CheckedSearchExample.xaml 示例代码如下:

<wd:Window x:Class="WpfApp1.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"        xmlns:custom="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"        xmlns:local="clr-namespace:WpfApp1"        mc:Ignorable="d"         Title="WPFDevelopers - 搜索多选控件" Height="450" Width="800">   <Window.Resources>        <ResourceDictionary>            <ResourceDictionary.MergedDictionaries>                <ResourceDictionary Source="pack://application:,,,/WpfApp1;component/CheckedSearch.xaml"/>            </ResourceDictionary.MergedDictionaries>        </ResourceDictionary>    </Window.Resources>  <!--公众号:WPF开发者-->    <Grid>        <custom:CheckedSearch             ItemsSource="{Binding ItemsSource,RelativeSource={RelativeSource AncestorType=Window}}"            VerticalAlignment="Top" Margin="0,10"/>    </Grid></wd:Window>

5)CheckedSearchExample.xaml 数据源示例代码如下:

using System.Collections.ObjectModel;using System.Windows;using WpfCustomControlLibrary1.Datas;namespace WpfApp1{    public partial class MainWindow    {        public ObservableCollection<CheckedSearchItem> ItemsSource        {            get { return (ObservableCollection<CheckedSearchItem>)GetValue(ItemsSourceProperty); }            set { SetValue(ItemsSourceProperty, value); }        }        public static readonly DependencyProperty ItemsSourceProperty =            DependencyProperty.Register("ItemsSource", typeof(ObservableCollection<CheckedSearchItem>), typeof(MainWindow), new PropertyMetadata(null));        public MainWindow()        {            InitializeComponent();            Loaded += MainWindow_Loaded;        }        private void MainWindow_Loaded(object sender, RoutedEventArgs e)        {            ItemsSource = new ObservableCollection<CheckedSearchItem>();            var items = new ObservableCollection<CheckedSearchItem>();            items.Add(new CheckedSearchItem { Name = "Winform" });            items.Add(new CheckedSearchItem { Name = "WPF" });            items.Add(new CheckedSearchItem { Name = "WinUI 3" });            items.Add(new CheckedSearchItem { Name = "MAUI" });            items.Add(new CheckedSearchItem { Name = "Avalonia UI" });            ItemsSource = items;        }    }}

读到这里,这篇“基于WPF怎么实现简单的下拉筛选控件”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于WPF怎么实现简单的下拉筛选控件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于WPF实现简单的下拉筛选控件

这篇文章主要为大家详细介绍了如何基于WPF实现简单的下拉筛选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-05-14

基于WPF怎么实现简单的下拉筛选控件

本文小编为大家详细介绍“基于WPF怎么实现简单的下拉筛选控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于WPF怎么实现简单的下拉筛选控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。WPF 简单实现下拉筛
2023-07-05

基于WPF实现筛选下拉多选控件

这篇文章主要为大家详细介绍了如何基于WPF实现简单的筛选下拉多选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-05-16

基于WPF实现多选下拉控件的示例代码

这篇文章主要为大家详细介绍了WPF实现简单的多选下拉控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-02-01

基于C#的wpf怎么实现Grid内控件拖动

这篇文章主要介绍“基于C#的wpf怎么实现Grid内控件拖动”,在日常操作中,相信很多人在基于C#的wpf怎么实现Grid内控件拖动问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于C#的wpf怎么实现Gri
2023-06-25

jquery怎么实现简单的下拉菜单

要实现简单的下拉菜单,可以使用jQuery的`slideDown()`和`slideUp()`方法来实现下拉和收起的效果。首先,在HTML中定义一个按钮和一个下拉菜单的容器:```html下拉菜单菜单项1菜单项2菜单项3```然后,在Jav
2023-08-18

JS怎么实现数组过滤从简单到多条件筛选

本篇内容主要讲解“JS怎么实现数组过滤从简单到多条件筛选”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现数组过滤从简单到多条件筛选”吧!目录单条件单数据筛选单条件多数据筛选多条件单数据
2023-06-20

基于Java怎么实现简单的邮件群发功能

今天小编给大家分享一下基于Java怎么实现简单的邮件群发功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pom文件引入第三
2023-06-30

c#下拉菜单的功能加入控件后功能怎么实现

在 c# 中,可以通过 combobox 控件实现下拉菜单功能:添加 combobox 控件。通过 items 属性设置选项列表(可直接指定或数据绑定)。处理 selectedindexchanged 事件以响应用户选择。C# 下拉菜单功能
c#下拉菜单的功能加入控件后功能怎么实现
2024-05-12

基于OpenCV和Gradio怎么实现简单的人脸识别

今天小编给大家分享一下基于OpenCV和Gradio怎么实现简单的人脸识别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。环境
2023-07-05

怎么用Python实现基于Pyqt5的简单电影搜索工具

这篇文章主要介绍“怎么用Python实现基于Pyqt5的简单电影搜索工具”,在日常操作中,相信很多人在怎么用Python实现基于Pyqt5的简单电影搜索工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录