国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#實(shí)現(xiàn)帶搜索功能的ComboBox

2020-01-24 00:57:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

帶搜索的ComboBox就是給ComboBox一個(gè)依賴屬性的ItemSource,然后通過(guò)數(shù)據(jù)源中是否包含要查詢的值,重新給ComboBox綁定數(shù)據(jù)源。

public class EditComboBox : ComboBox  {    private bool t = true;//首次獲取焦點(diǎn)標(biāo)志位    private ObservableCollection<object> bindingList = new ObservableCollection<object>();//數(shù)據(jù)源綁定List    private string editText = "";//編輯文本內(nèi)容    /// <summary>    /// 注冊(cè)依賴事件    /// </summary>    public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(ValueChanged)));    /// <summary>    /// 數(shù)據(jù)源改變,添加數(shù)據(jù)源到綁定數(shù)據(jù)源    /// </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();      //遍歷循環(huán)操作      foreach (var item in ecb.MyItemsSource)      {        ecb.bindingList.Add(item);      }    }    /// <summary>    /// 設(shè)置或獲取ComboBox的數(shù)據(jù)源    /// </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>    /// 下拉框獲取焦點(diǎn),首次搜索文本編輯框    /// </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)        {          //注冊(cè)文本改變事件          (child as TextBox).TextChanged += EditComboBox_TextChanged;        }        else        {          FindTextBox(child);        }      }    }    /// <summary>    /// 文本改變,動(dòng)態(tài)控制下拉條數(shù)據(jù)源    /// </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>    /// 組合框關(guān)閉,數(shù)據(jù)源恢復(fù)    /// </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>    /// 過(guò)濾符合條件的數(shù)據(jù)項(xiàng),添加到數(shù)據(jù)源項(xiàng)中    /// </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());      }    }  }

調(diào)用方法就是將數(shù)據(jù)源綁定到MyItemsSource上,剩下的就和原有的ComboBox用法一樣了。

復(fù)制代碼 代碼如下:
<local:EditComboBox MyItemsSource="{Binding ProList,Mode=TwoWay}" SelectedItem="{Binding Selpro,Mode=TwoWay}" SelectedValuePath="Id" DisplayMemberPath="Name"/>

效果演示

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田县| 开封市| 章丘市| 大埔县| 库伦旗| 策勒县| 崇礼县| 仁寿县| 普陀区| 泸定县| 徐闻县| 开远市| 庆云县| 兴安盟| 万安县| 台中市| 汉寿县| 米脂县| 濮阳县| 同仁县| 万盛区| 东乌| 二连浩特市| 临猗县| 湟源县| 财经| 永泰县| 亳州市| 思南县| 虞城县| 襄垣县| 黔江区| 北流市| 天门市| 邢台县| 潍坊市| 琼海市| 海城市| 永川市| 大竹县| 长海县|