2016-09-12 55 views
1

我做了充分利用互聯網安排一些事件,這個事件被插入一個ListView中的應用程序,這個名單組織內容在GroupDescription這樣的:在UI上過濾ObservableCollection項目?

<CollectionViewSource Source="{Binding Matches}" x:Key="GroupedItems"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="MatchNation" /> 
      <PropertyGroupDescription PropertyName="MatchLeague" /> 
     </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

現在,我有一個TextBox,其中可使用搜索Matches集合中的特定項目,我試圖實現的是使用用戶在TextBox中提供的給定search字符串過濾集合。

我現在所做的是使用linq創建備份並刪除所有不適合用戶search字符串的項目,但我注意到這個代碼太重,也太用於實現簡單的UI過濾器的很多代碼。

我想知道是否有可能創建像xaml後面的東西。所以基本上,我在xaml中綁定了一個屬性,該屬性獲取由TextBox提供的搜索字符串,並且當值更改Matches集合時,將通過搜索文本進行過濾,所有這些都通過xaml進行。

這可能嗎?

物品avaialble在Matches

  • 你好
  • 世界

TextBox =>你好用戶搜索:

ListView將只顯示Hello

回答

0

有了性能,您可能需要嘗試幾件事情,只需測量實際結果即可找到最佳答案。不過,我認爲在CollectionViewSource上使用Filter回調很有意義。基本上,您只需將Filter屬性分配給回調函數,回調函數接受來自源的項目並返回bool以指示是否應該顯示它。這裏有一個例子:

// Create a view of your data, the listview should be bound to this too 
ICollectionView _matchesView = CollectionViewSource.GetDefaultView(Matches); 
// assign the Filter callback to setup filtering 
_matchesView.Filter = FilterMatches; 

// write the callback method, which returns true for items to display and false for items to hide 
private bool MatchFilter(object item) 
{ 
    // you can put any logic you need in here 
    var match = item as string; 
    return match.Contains(_searchQuery); 
} 

如果源集合或搜索查詢的變化,那麼你就需要太更新集合視圖源。例如,如果您有一個FilterString屬性(例如,綁定到用戶輸入搜索字詞的位置),則可以在setter中執行類似操作。問題是,當有事情發生變化時,您需要致電Refresh()

public string FilterString 
{ 
    get { return _filterString; } 
    set 
    { 
     _filterString = value; 
     NotifyPropertyChanged(nameof(FilterString)); 
     _matchesView.Refresh(); 
    } 
} 

主要的變化是,你ListView需要被綁定到集合視圖源利用內置到該對象的篩選。否則,如果listview仍然綁定到實際集合上,則不會對其進行過濾。您可以將視圖源視爲視圖模型中的屬性或視圖後面的代碼。

+0

如果我使用.GetDefaultView,我必須聲明ObservableCollection爲靜態,爲什麼? – AgainMe

+0

您不需要將其設置爲靜態。它應該是這樣的: 'ObservableCollection _matches = new ObservableCollection (); var cvs = CollectoinViewSource.GetDefaultView(_matches); cvs.Filter = ...'GetDefaultView()方法是靜態的,但是你可以傳遞一個非靜態的參數給它。 – rmc00

+0

好吧,過濾器我需要通過像'FilterString'這樣的屬性,就像你是例子嗎? – AgainMe