C#实现带搜索功能的ComboBox
作者:眾尋 发布时间:2022-08-29 06:52:48
标签:C#,搜索,ComboBox
带搜索的ComboBox就是给ComboBox一个依赖属性的ItemSource,然后通过数据源中是否包含要查询的值,重新给ComboBox绑定数据源。
public class EditComboBox : ComboBox
{
private bool t = true;//首次获取焦点标志位
private ObservableCollection<object> bindingList = new ObservableCollection<object>();//数据源绑定List
private string editText = "";//编辑文本内容
/// <summary>
/// 注册依赖事件
/// </summary>
public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(ValueChanged)));
/// <summary>
/// 数据源改变,添加数据源到绑定数据源
/// </summary>
/// <param name="d"></param>
/// <param name="e"></param>
private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
EditComboBox ecb = d as EditComboBox;
ecb.bindingList.Clear();
//遍历循环操作
foreach (var item in ecb.MyItemsSource)
{
ecb.bindingList.Add(item);
}
}
/// <summary>
/// 设置或获取ComboBox的数据源
/// </summary>
public IEnumerable MyItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourcePropertyNew);
}
set
{
if (value == null)
ClearValue(ItemsSourcePropertyNew);
else
SetValue(ItemsSourcePropertyNew, value);
}
}
/// <summary>
/// 重写初始化
/// </summary>
/// <param name="e"></param>
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
this.IsEditable = true;
this.IsTextSearchEnabled = false;
this.ItemsSource = bindingList;
}
/// <summary>
/// 下拉框获取焦点,首次搜索文本编辑框
/// </summary>
/// <param name="e"></param>
protected override void OnGotFocus(RoutedEventArgs e)
{
if (t)
FindTextBox(this);
else
t = false;
}
/// <summary>
/// 搜索编辑文本框,添加文本改变事件
/// </summary>
/// <param name="obj"></param>
private void FindTextBox(DependencyObject obj)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child!=null && child is TextBox)
{
//注册文本改变事件
(child as TextBox).TextChanged += EditComboBox_TextChanged;
}
else
{
FindTextBox(child);
}
}
}
/// <summary>
/// 文本改变,动态控制下拉条数据源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EditComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox tb = sender as TextBox;
if(tb.IsFocused)
{
this.IsDropDownOpen = true;
if (editText == this.Text)
return;
editText = this.Text;
SetList(editText);
}
}
/// <summary>
/// 组合框关闭,数据源恢复
/// </summary>
/// <param name="e"></param>
protected override void OnDropDownClosed(EventArgs e)
{
base.OnDropDownClosed(e);
if (MyItemsSource == null)
return;
foreach (var item in MyItemsSource)
{
if (!bindingList.Contains(item))
bindingList.Add(item);
}
}
/// <summary>
/// 过滤符合条件的数据项,添加到数据源项中
/// </summary>
/// <param name="txt"></param>
private void SetList(string txt)
{
try
{
string temp1 = "";
string temp2 = "";
if (MyItemsSource == null)
return;
foreach (var item in MyItemsSource)
{
temp1 = item.GetType().GetProperty(this.DisplayMemberPath).GetValue(item, null).ToString();
if (string.IsNullOrEmpty(this.SelectedValuePath))
{
temp2 = "";
}
else
{
temp2 = item.GetType().GetProperty(this.SelectedValuePath).GetValue(item, null).ToString();
}
if(temp1.Contains(txt)||temp2.StartsWith(txt))
{
if (!bindingList.Contains(item))
bindingList.Add(item);
}
else if (bindingList.Contains(item))
{
bindingList.Remove(item);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
调用方法就是将数据源绑定到MyItemsSource上,剩下的就和原有的ComboBox用法一样了。
<local:EditComboBox MyItemsSource="{Binding ProList,Mode=TwoWay}" SelectedItem="{Binding Selpro,Mode=TwoWay}" SelectedValuePath="Id" DisplayMemberPath="Name"/>
效果演示


猜你喜欢
- 一,定义变量C# 表达式树中,定义一个变量,使用 ParameterExpression。创建变量结点的方法有两种,Express
- 一、前言随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了
- 1、下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java2、下载下来的包解压后
- C/C++ 左移<<, 右移>>作用1. 左移 <<取两个数字,左移第一个操作数的位,第二个操作数决定要
- 手机或照机拍摄的照片名称通常是”IMG_001.JPG”这种格式,这种文件名称是无意义的。使用照片拍摄时间命名可以让我们在多年以后查找照片时
- 本文实例讲述了Java权重随机的实现方法。分享给大家供大家参考。具体分析如下:权重随机在项目中经常用到,所以我把它抽象到一个工具类中。一般实
- 记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5
- SpringBoot项目jar发布获取jar包所在目录路径ApplicationHome ah = new ApplicationHome(
- 前言Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能
- 看完本文你将了解:ACTION_CANCEL的触发时机滑出子View区域会发生什么?为什么不响应onClick()事件首先看一下官方的解释:
- 简介本文用示例介绍java的Duration的用法。Duration和Period说明Duration类通过秒和纳秒相结合来描述一个时间量,
- 原装的Android标题栏配色比较单调,就是黑色的一坨,现在假设你的软件需要独自添加标题栏,这样不仅美观而且可以将进度条等加进去,如何实现:
- 1>方法一之前在配置 Maven 的 settings.xml 时,都会设置 mirror 节点,例如:<mirrors>
- 前言周六在公司写Reactor模型,一女同事问我为啥都2023年了还在学习Reactor模型呀,我问她为啥快30的年纪了,周六还在公司看我写
- 本文给大家介绍Activity的生命周期,如果大家学习过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController
- 前言最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号。每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动
- 一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。 java多线程,传统创建线程的方式有两种。
- springboot+调用支付宝第三方接口(沙箱环境)大神勿喷!!网址:https://developers.alipay.com/plat
- 如何使用struts2 * ,或者自定义 * 。特别注意,在使用 * 的时候,在Action里面必须最后一定要引用struts2自带的 *
- 一、点睛邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个二维数组存储图中节点之间的邻接关系。邻接矩阵可以用来表示无向图、有向图和网。