创建一个TextBoxSearch以从ListView WPF中过滤
我正在创建一个应用程序,允许用户使用WPF将一些Employee详细信息添加到EntityFramework
模型中。
到目前为止,我有一个ListView
来表示员工姓名列表,当您选择员工姓名时,它会选择另一个ListView
中的特定数据。 我使用Predicate
和ICollectionSource
完成了这个。
但我现在想要实现的是拥有一个所谓的搜索引擎。 因此,当用户在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
我有以下代码与我合作,但我不得不放弃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绑定路径
希望这将解决您的问题