MVVM 列表框不会使用筛选的集合进行更新


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(或者ItemsSourceBinding)将在将Predicate<object>赋值给ICollectionView.Filter属性时自动更新。

相关内容

  • 没有找到相关文章

最新更新