in XAML:
<ListBox x:Name="AllJobListBox" MinHeight="200" MinWidth="500" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Path=AllJobList}" >
in CodeBehind:
DataContext = new LoadJobWindowViewModel();
//ctor where ObservableCollection is instantiated and populated
in ViewModel: //bound to textbox on View
public string SearchText {
get {
return searchText;
}
set {
searchText = value;
OnPropertyChanged("SearchText");
}
}
Command:
public void SearchJob()
{
ObservableCollection<Job> filteredJobs = new ObservableCollection<Job>(AllJobList.Where(j => j.JobName.Contains(SearchText)));
AllJobList = filteredJobs;
}
我一直在浏览博客和帖子,试图找出我遗漏了什么或做错了什么,但我不能指出来。如能提供任何帮助,我将不胜感激。
确保AllJobList
引发INotifyPropertyChanged.PropertyChanged
事件
就性能而言,您当前的解决方案非常昂贵。您应该始终避免替换完整的源集合实例,因为它将强制ListBox
丢弃所有容器并开始完整的布局传递。相反,您希望使用ObservableCollection
并对其进行修改。
出于这个原因,您应该总是倾向于通过集合的视图(ICollectionView
)进行筛选和排序。参见Microsoft文档:数据绑定概述-集合视图。操作视图也不需要对原始集合进行筛选或排序:
ICollectionView allJobListView = CollectionViewSource.GetDefaultView(this.AllJobList);
allJobListView.Filter = item => (item as Job).JobName.Contains(this.SearchText);
由于Binding
总是使用集合的视图作为源,而不是集合本身(参见上面的链接),ListBox
(或者ItemsSource
Binding
)将在将Predicate<object>
赋值给ICollectionView.Filter
属性时自动更新。