简单的WPFcomboboxfilter

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

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

public class FilterViewModel { public IEnumerable 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 + "*'"); */ } } 

XAML

  

产量

我认为CollectionView正是您所寻找的。

  public ObservableCollection 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 } 

您想使用“ClassesCollectionView”作为Combobox的ItemsSource