2013-06-01 62 views
0

我剛剛在我的第一個MVVM項目中實現了一個ICollectionView,並讓它工作。不過,我認爲實施可能更好,更流暢。我會發布與我的ICollectionView有關的代碼,如果有人能夠給我提供任何關於如何簡化或改進它的提示或建議,請讓我知道。這裏是我的代碼:高效實現ICollectionView過濾

private ICollectionView _advFilter; 

public ICollectionView AdventurerFilter 
{ 
    get { return _advFilter; } 
    set 
    { 
     if (_advFilter != value) 
     { 
      _advFilter = value; 
      RaisePropertyChanged(() => AdventurerFilter); 
     } 
    } 
} 


public MainViewModel() 
{ 
    AdvNoFilter(); 
} 


public void LoadGameExecute() 
{ 
    //Serialization Logic 

    AdvNoFilter(); 
} 

public void ShowAllExecute() 
{ 
    AdvNoFilter(); 
} 

public void ShowEmployedExecute() 
{ 
    AdvFilter(AdvStatus.Employed); 
} 

public void ShowAvailableExecute() 
{ 
    AdvFilter(AdvStatus.Available); 
} 


void AdvFilter(AdvStatus status) 
{ 
    AdventurerFilter = CollectionViewSource.GetDefaultView(Adventurers); 
    AdventurerFilter.Filter = adv => ((Adventurer)adv).Status.Equals(status); 
} 

void AdvNoFilter() 
{ 
    AdventurerFilter = CollectionViewSource.GetDefaultView(Adventurers); 
    AdventurerFilter.Filter = null; 
} 

所有這一切都在我的MainViewModel。 Show ... Execute命令綁定到我的MainView中的按鈕,數據顯示在ListBox中,該數據綁定到AdventurerFilter。就像我以前悲傷一樣,它很有效,但我嚴重懷疑這不可能更有效率地完成。任何意見,將不勝感激!

編輯:我應該早些提到這個,但AdventurersObservableCollection

+0

爲什麼你不能使用內置列表中的一個? 'ObservableCollection <>'可以做你所需要的,或者你可以從這裏使用'SortableObservableCollection':http://sortablecollection.codeplex.com/ – jugg1es

+0

'冒險家'是一個'ObservableCollection'。您發佈的鏈接根本不包括過濾。 –

回答

1

該代碼不是實現ICollectionView。它僅使用通過CollectionViewSource.GetDefaultView獲得的默認實現。

可以緩存獲得ICollectionView,沒有必要到要更換過濾器,每次給它分配:

private ICollectionView _advFilter; 

public MainViewModel() 
{ 
    // assuming that Adventurers is ObservableCollection<Adventurer> 
    _advFilter = CollectionViewSource.GetDefaultView(Adventurers); 

    AdvNoFilter(); 
} 

public void ShowEmployedExecute() 
{ 
    AdvFilter(AdvStatus.Employed); 
} 

public void ShowAvailableExecute() 
{ 
    AdvFilter(AdvStatus.Available); 
} 

void AdvFilter(AdvStatus status) 
{ 
    _advFilter.Filter = adv => ((Adventurer)adv).Status.Equals(status); 
    _advFilter.Refresh(); 
} 

void AdvNoFilter() 
{ 
    _advFilter.Filter = null; 
    _advFilter.Refresh(); 
} 
+0

感謝您的回答。這工作完美。 –