MVVM ListBox 不会使用过滤后的集合进行更新

MVVM ListBox won't update with filtered Collection

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 Docs: Data binding overview - Collection views。操作视图也不需要过滤或排序原始集合:

ICollectionView allJobListView = CollectionViewSource.GetDefaultView(this.AllJobList);
allJobListView.Filter = item => (item as Job).JobName.Contains(this.SearchText);

由于 Binding 总是使用集合的视图作为源而不是集合本身(参见上面的 link),ListBox(或 ItemsSource Binding 准确地说)将 Predicate<object> 分配给 ICollectionView.Filter 属性.

时会自动更新