帶搜索的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用法一樣了。
效果演示

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選