【发布时间】:2017-07-25 01:14:05
【问题描述】:
我在 WPF 中遇到了 MVVM,我设置了一个 ObservableCollection 和一个 ICollectionView。 ICollectionView 设置为DataGrid 的ItemsSource,模型为Job 类型。
我已经为这两个集合设置了 getter 和 setter,但是当我在 ICollectionView 上设置 Filter 而不是 Job 被 SearchString 过滤时,它们只是一遍又一遍地复制再次让我相信他们设置收藏夹的方式是完全错误的。
以下是两个集合的获取/设置方式:
public ObservableCollection<Job> AllJobs
{
get
{
foreach (var job in _allJobsList)
_allJobs.Add(job);
return _allJobs;
}
set
{
if (_allJobs == value) return;
OnPropertyChanged("AllJobs");
}
}
public ICollectionView AllJobsView
{
get
{
_allJobsView = CollectionViewSource.GetDefaultView(AllJobs);
return _allJobsView;
}
set
{
if (_allJobsView == value)
{
return;
}
_allJobsView = value;
OnPropertyChanged("AllJobsView");
}
}
现在我有一个名为SearchString 的字符串绑定到TextBox.Text。当文本更改时,我会执行以下操作:
public string SearchString
{
get => _searchString;
set
{
if (_searchString == value) return;
_searchString = value;
FilterJobs();
OnPropertyChanged("SearchString");
}
}
private void FilterJobs()
{
AllJobsView.Filter = x =>
{
var viewJob = x as Job;
return viewJob != null && viewJob.Number.Contains(_searchString);
};
}
现在当页面首次加载时,DataGrid 中加载了正确的 Jobs。但是,如果Job.Number 确实包含SearchString,则一旦用户键入Jobs,就会重复。如何设置集合以便我可以适当地设置过滤器?
【问题讨论】: