2017-07-24 92 views
0

我陷入WPF中的MVVM中,并且我已经设置了ObservableCollectionICollectionViewICollectionView被设置为DataGrid的ItemsSource,并且该模型是Job的类型。MVVM中ICollectionView和正确绑定和ObservableCollection的过滤方法

我已经为这两个集合然而,当我设置的ICollectionView而不是Job一个Filter由他们只是重复了一遍又一遍的SearchString被过滤的设置getter和setter方法,导致我相信,他们的方式,我有收藏安装是完全错误的。

下面是两个集合是如何的get/set:

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"); 
    } 
} 

现在我有一个stringcalled 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就会被复制。我如何设置集合以便我可以适当地设置过滤器?

+0

https://stackoverflow.com/a/39438710/1069200 –

回答

1

问题在于ObservableCollection的getter。每次你“获得”收藏品时,你都会重新将每一件物品都加入到收藏品中。

您的代码:

get 
{ 
    foreach (var job in _allJobsList) 
     _allJobs.Add(job); 
    return _allJobs; 
} 

相反,它应该是:

get 
{   
    return _allJobs; 
} 

您的ObservableCollection的制定者也缺少了 “二传手”(私有字段=值)代码:

set 
{ 
    if (value != _allJobs) 
    { 
     _allJobs = value; 
     OnPropertyChanged("AllJobs"); 
    } 
} 

你的物业A然后llJobs是:

private ObservableCollection<Job> _allJobs; 
public ObservableCollection<Job> AllJobs 
{ 
    get 
    {   
     return _allJobs; 
    } 
    set 
    { 
     if (value != _allJobs) 
     { 
      _allJobs = value; 
      OnPropertyChanged("AllJobs"); 
     } 
    } 
} 

您的收藏的初始化应该是(在你的财产的getter和不)别的地方一样,在视图模型或/和构造的方法,一个命令拨打电话后,用户要求刷新收藏。

例如,如果你的VieModel被称为MyViewModel和你List<Job>被称为_allJobsList,可以初始化您的收藏像这样:

public MyViewModel() 
{ 
    //fill the _allJobsList first, getting from a database for example: _allJobsList = GetJobs(); 
    //and then create an observable collection from that list 
    AllJobs = new ObservableCollection<Job>(_allJobsList); 
} 
相关问题