2017-07-24 90 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); 
} 
相關問題