博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带搜索的ComboBox
阅读量:5241 次
发布时间:2019-06-14

本文共 4866 字,大约阅读时间需要 16 分钟。

原文:

带搜索的ComboBox就是给ComboBox一个依赖属性的ItemSource,然后通过数据源中是否包含要查询的值,重新给ComboBox绑定数据源。

public class EditComboBox : ComboBox    {        private bool t = true;//首次获取焦点标志位        private ObservableCollection bindingList = new ObservableCollection();//数据源绑定List        private string editText = "";//编辑文本内容        ///         /// 注册依赖事件        ///         public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(ValueChanged)));        ///         /// 数据源改变,添加数据源到绑定数据源        ///         ///         ///         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);            }        }        ///         /// 设置或获取ComboBox的数据源        ///         public IEnumerable MyItemsSource        {            get            {                return (IEnumerable)GetValue(ItemsSourcePropertyNew);            }            set            {                if (value == null)                    ClearValue(ItemsSourcePropertyNew);                else                    SetValue(ItemsSourcePropertyNew, value);            }        }        ///         /// 重写初始化        ///         ///         protected override void OnInitialized(EventArgs e)        {            base.OnInitialized(e);            this.IsEditable = true;            this.IsTextSearchEnabled = false;            this.ItemsSource = bindingList;        }        ///         /// 下拉框获取焦点,首次搜索文本编辑框        ///         ///         protected override void OnGotFocus(RoutedEventArgs e)        {            if (t)                FindTextBox(this);            else                t = false;        }        ///         /// 搜索编辑文本框,添加文本改变事件        ///         ///         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);                }            }        }        ///         /// 文本改变,动态控制下拉条数据源        ///         ///         ///         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);            }        }        ///         /// 组合框关闭,数据源恢复        ///         ///         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);            }        }        ///         /// 过滤符合条件的数据项,添加到数据源项中        ///         ///         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用法一样了。

效果演示

posted on
2019-04-29 11:37 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10789483.html

你可能感兴趣的文章
enyo官方开发入门教程翻译一Getting Started之A Tour of Enyo
查看>>
Daily Scrum 10.9
查看>>
Parallel Programming-多消费者,多生产者同时运行并行
查看>>
hdu 2044-2050 递推专题
查看>>
hdu 3573(数学+贪心)
查看>>
一个曲折的让我懵了的故事
查看>>
asp.net文本框中如何禁止复制粘贴
查看>>
无法打开输入文件“optimized.lib” 编译osgEarth2.8+VS2013+CMake3.4.0在Release版本的问题...
查看>>
avs2解码软件:参考帧管理
查看>>
【刷题】BZOJ 3144 [Hnoi2013]切糕
查看>>
Python--进阶处理9
查看>>
判断对象相等时的问题(==)
查看>>
忘记linux root密码或进入单用户方法
查看>>
CryptographyUtil盐加密
查看>>
湖南集训day4
查看>>
在终端更改MAC的MySQL的root密码
查看>>
求整数的二进制表示中1的个数 (转)
查看>>
高仿BiliBili的iOS客户端源码项目
查看>>
poj 1228 凸包
查看>>
webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html
查看>>