C# 简单WPF组合框过滤器

C# 简单WPF组合框过滤器,c#,wpf,combobox,C#,Wpf,Combobox,我在谷歌上搜索了一个简单的解决方案,但没有找到运气。我有一个标准的WPF组合框,我只想能够根据组合框有焦点时用户键入的前2或3个字母过滤显示的列表。我尝试了一些编码,包括一些lamba表达式,但在指定了“combobox.Items.Filter”的行中不断抛出错误“System.NotSupportedException”。我没有使用MVVM,只是希望用户可以使用这个简单的功能。请帮忙!请注意,IsEditable、IsTextSearchEnabled和StaysOpenOneEdit属性设

我在谷歌上搜索了一个简单的解决方案,但没有找到运气。我有一个标准的WPF组合框,我只想能够根据组合框有焦点时用户键入的前2或3个字母过滤显示的列表。我尝试了一些编码,包括一些lamba表达式,但在指定了“combobox.Items.Filter”的行中不断抛出错误“System.NotSupportedException”。我没有使用MVVM,只是希望用户可以使用这个简单的功能。请帮忙!请注意,IsEditable、IsTextSearchEnabled和StaysOpenOneEdit属性设置为true,但尚未实现所需的功能

我认为CollectionView正是您想要的

  public ObservableCollection<NdfClassViewModel> Classes
  {
      get { return _classes; }
  }

  public ICollectionView ClassesCollectionView
  {
      get
      {
          if (_classesCollectionView == null)
          {
              BuildClassesCollectionView();
          }
           return _classesCollectionView;
      }
  }

  private void BuildClassesCollectionView()
  {
      _classesCollectionView = CollectionViewSource.GetDefaultView(Classes);
      _classesCollectionView.Filter = FilterClasses;

      OnPropertyChanged(() => ClassesCollectionView);
  }

  public bool FilterClasses(object o)
  {
      var clas = o as NdfClassViewModel;



      // return true if object should be in list with applied filter, return flase if not
  }
公共ObservableCollection类
{
获取{return\u classes;}
}
公共ICollectionView类集合视图
{
得到
{
if(_classesCollectionView==null)
{
buildClasseCollectionView();
}
返回_classesCollectionView;
}
}
私有void buildClasseCollectionView()
{
_ClasseCollectionView=CollectionViewSource.GetDefaultView(类);
_ClasseCollectionView.Filter=FilterClass;
OnPropertyChanged(()=>ClasseCollectionView);
}
公共布尔过滤器类(对象o)
{
var clas=o作为NdfClassViewModel;
//如果对象应该在应用过滤器的列表中,则返回true;如果不在列表中,则返回flase
}

您想使用“ClasseCollectionView”作为组合框的项目资源

我开发了一个示例应用程序。我使用字符串作为记录项,您可以使用自己的实体来完成。退格也可以正常工作

 public class FilterViewModel
    {
        public IEnumerable<string> DataSource { get; set; }       

        public FilterViewModel()
        {
            DataSource = new[] { "india", "usa", "uk", "indonesia" };           
        }
    }

public partial class WinFilter : Window
    {
          public WinFilter()
          {
             InitializeComponent();

             FilterViewModel vm = new FilterViewModel();
             this.DataContext = vm;
          }

          private void Cmb_KeyUp(object sender, KeyEventArgs e)
          {
              CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);

              itemsViewOriginal.Filter = ((o) =>
              {
                  if (String.IsNullOrEmpty(Cmb.Text)) return true;
                  else
                  {
                     if (((string)o).Contains(Cmb.Text)) return true;
                     else return false;
                  }
              });

             itemsViewOriginal.Refresh();

             // if datasource is a DataView, then apply RowFilter as below and replace above logic with below one
             /* 
              DataView view = (DataView) Cmb.ItemsSource; 
              view.RowFilter = ("Name like '*" + Cmb.Text + "*'"); 
             */
          }
     }
公共类FilterViewModel
{
公共IEnumerable数据源{get;set;}
公共过滤器模型()
{
数据来源=新[]{“印度”、“美国”、“英国”、“印度尼西亚”};
}
}
公共部分类WinFilter:窗口
{
公共WinFilter()
{
初始化组件();
FilterViewModel vm=新的FilterViewModel();
this.DataContext=vm;
}
私有无效Cmb_KeyUp(对象发送方,KeyEventArgs e)
{
CollectionView itemsViewOriginal=(CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);
itemsViewOriginal.Filter=((o)=>
{
if(String.IsNullOrEmpty(Cmb.Text))返回true;
其他的
{
if(((字符串)o).Contains(Cmb.Text))返回true;
否则返回false;
}
});
itemsViewOriginal.Refresh();
//如果数据源是一个DataView,则应用如下所示的RowFilter,并将上面的逻辑替换为下面的逻辑
/* 
数据视图=(数据视图)Cmb.ItemsSource;
view.RowFilter=(“名称如“*”+Cmb.Text+“*”);
*/
}
}
XAML



您想让programm从programm na中的可用列表中进行预测。组合框使用数据表填充,但列表中有几百个选项。因此,当用户键入几个字符时,我需要缩短列表并打开以供选择。我认为查询检查时出现了一些错误。。。对不起,我没听清楚,你想问什么问题?检查那个链接。。。。我想你也有类似的问题谢谢你的回复!但是我仍然在指定combobox.Items.Filter的行中得到错误。在这两个回复中,我仍然得到“System.NotSupportedException”。我甚至尝试过创建一个从组合框继承的自定义控件,但仍然出现相同的错误。是否有任何人都可以推荐的第三方工具?这快把我逼疯了@宝贝,你一定在做傻事。你可以在dropbox.com上传你的代码并分享链接。我也这么认为!!也许值得一提的是,我是直接从数据表绑定的?WPF完全是初学者,所以我确信我遗漏了一些愚蠢的东西。我在某个地方读到datatables不支持过滤(我这样做),但这不是我应该首先使用ICollectionView的原因吗?@BabyDoll'itemsViewOriginal`
CollectionView itemsViewOriginal=(CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource)调试时,我看到datatable的内容包含正确的数据。我突然想到一件事;我正在尝试筛选数据,但我没有指定要使用的列…这是我的问题吗??如果是,我如何指定要用于过滤的列?
<ComboBox x:Name="Cmb"
          IsTextSearchEnabled="False"
          IsEditable="True"
          ItemsSource="{Binding DataSource}"
          Width="120"
          IsDropDownOpen="True"
          StaysOpenOnEdit="True"
          KeyUp="Cmb_KeyUp" />