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
属性.
时会自动更新
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
属性.