创建一个TextBoxSearch以从ListView WPF中过滤

我正在创建一个应用程序,允许用户使用WPF将一些Employee详细信息添加到EntityFramework模型中。

到目前为止,我有一个ListView来表示员工姓名列表,当您选择员工姓名时,它会选择另一个ListView中的特定数据。 我使用PredicateICollectionSource完成了这个。

但我现在想要实现的是拥有一个所谓的搜索引擎。 因此,当用户在TextBox中键入员工姓名时,它会根据在搜索框中键入的内容过滤员工姓名的名称。

我使用This Link作为指南,但我不太清楚如何在我自己的设计中实现它; 在示例中,他们使用了Resource并使用了Array

这是我尝试过的,使用Predicate ;

  private EmployeeListViewModel() : base("") { EmployeeList = new ObservableCollection(GetEmployees()); this._view = new ListCollectionView(this.employeeList); } private ListCollectionView _view; public ICollectionView View { get { return this._view; } } private string _TextSearch; public string TextSearch { get { return _TextSearch; } set { _TextSearch = value; OnPropertyChanged("TextSearch"); if (String.IsNullOrEmpty(value)) View.Filter = null; else View.Filter = new Predicate(o => ((EmployeeViewModel)o).FirstName == value); } } 

在我看来;

  

但似乎发生的事情是,当我输入内容时,它会抛出此exception;

Object reference not set to an instance of an object.

所以我的问题是,我如何实现这一点,所以它实际上使我能够过滤搜索框中的名称列表?

任何帮助将是感激或指导如何实现这一目标。

创建测试项目后确定我无法重现您的exception

这是我的工作代码:

MainWindow.xaml

               

MainWindow.cs

 using System.Windows; namespace gregory.bmclub { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new EmployeeListViewModel(); } } } 

EmployeeViewModel.cs

 namespace gregory.bmclub { public class EmployeeViewModel { string firstname; public string FirstName { get { return firstname; } set { firstname = value; } } } } 

EmployeeListViewModel.cs

 using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows.Data; using System.ComponentModel; namespace gregory.bmclub { class EmployeeListViewModel : INotifyPropertyChanged { #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion public EmployeeListViewModel()//modified to public { EmployeeList = new ObservableCollection(GetEmployees()); this._view = new ListCollectionView(this.employeeList); } #region nonModifiedCode private ListCollectionView _employeeCol; public ICollectionView EmployeeCollection { get { return this._employeeCol; } } private ObservableCollection employeeList; public ObservableCollection EmployeeList { get { return employeeList; } set { employeeList = value; OnPropertyChanged("EmployeeList"); } } private ListCollectionView _view; public ICollectionView View { get { return this._view; } } private string _TextSearch; public string TextSearch { get { return _TextSearch; } set { _TextSearch = value; OnPropertyChanged("TextSearch"); if (String.IsNullOrEmpty(value)) View.Filter = null; else View.Filter = new Predicate(o => ((EmployeeViewModel)o).FirstName == value); } } #endregion //created for testing private List GetEmployees() { var mylist = new List(); mylist.Add(new EmployeeViewModel() { FirstName = "nummer1" }); mylist.Add(new EmployeeViewModel() { FirstName = "nummer2" }); return mylist; } } } 

我有以下代码与我合作,但我不得不放弃Textsearch方法和一个不同的,我添加了视图行代码,希望使您的代码工作。

 private EmployeeListViewModel() : base("") { EmployeeList = new ObservableCollection(GetEmployees()); this._view = new ListCollectionView(this.employeeList); myEmployeeList = new CollectionViewSource(); myEmployeeList.Source = this.EscortList; myEmployeeList.Filter += ApplyFilter; } internal CollectionViewSource employeeList { get; set; } internal CollectionViewSource myEmployeeList { get; set; } private ObservableCollection employeeList; public ObservableCollection EmployeeList { get { return employeeList; } set { employeeList = value; OnPropertyChanged("EmployeeList"); } } private ListCollectionView _view; // the collection below is the collection you will need to be your listview itemsource {Binding View} public ICollectionView View { //you need to return your CollectionViewSource here get { return myEmployeeList._view; } } // you need to use the following filtering methods as it did work for methods private void OnFilterChanged() { myEmployeeList.View.Refresh(); } private string filter; public string Filter { get { return this.filter; } set { this.filter = value; OnFilterChanged(); } } void ApplyFilter(object sender, FilterEventArgs e) { EmployeeViewModel svm = (EmployeeViewModel)e.Item; if (string.IsNullOrWhiteSpace(this.Filter) || this.Filter.Length == 0) { e.Accepted = true; } else { // you can change the property you want to search your model e.Accepted = svm.Surname.Contains(Filter); } } 

这是我绑定到Listview的Xaml代码

  

这是我的文本搜索filter绑定路径

  

希望这将解决您的问题