2016-09-12 2 views
1

내가 인터넷에서 예정된 일부 이벤트는,이 이벤트가 ListView 내부에 삽입 얻을 응용 프로그램이 목록은 다음과 같이 GroupDescription의 콘텐츠를 구성했다 : 나는 TextBox을했습니다, 지금필터 UI의 ObservableCollection 항목?

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

을 어디에 사용 할 수 있습니다 Matches 컬렉션 내의 특정 항목을 검색하려면, 내가 달성하려고하는 것은 주어진 search 문자열을 사용하여 컬렉션을 필터링하고 TextBox에 사용자가 제공 한 문자열입니다.

linq을 사용하는 기계는 컬렉션의 백업을 만들고 사용자 search 문자열에 맞지 않는 모든 항목을 제거하지만이 코드는 너무 무겁고 또한 너무주의해야합니다. 간단한 UI 필터를 구현하기위한 많은 코드.

xaml과 비슷한 것을 만들 수 있는지 궁금합니다. 그래서 본질적으로 xambl에서 TextBox에 의해 제공되는 검색 문자열을 얻는 속성에 바인드했습니다. 값이 바뀌면 Matches 컬렉션이 검색된 텍스트로 필터링되어 xaml을 통해 필터링됩니다.

이것이 가능합니까? 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 속성이있는 경우 사용자가 검색어를 입력하는 위치에 바인딩되며 설정자에서 이와 같은 작업을 수행 할 수 있습니다. 요점은 뭔가 변경 될 때 Refresh()에 전화해야한다는 것입니다.

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

주요 변화

ListView 필요가 해당 객체에 내장 된 필터링을 활용하여 수집 소스보기에 바인딩 할 수 있다는 것입니다. 그렇지 않으면 실제 컬렉션에 여전히 바인딩되어있는 경우 목록보기가 필터링되지 않습니다. 뷰 소스에서 뷰 소스의 속성을 만들거나 뷰 뒤에서 코드를 작성할 수 있습니다.

+0

.GetDefaultView를 사용하는 경우 ObservableCollection을 정적으로 선언해야합니다. 그 이유는 무엇입니까? – AgainMe

+0

정적으로 설정할 필요는 없습니다.그것은 다음과 같아야합니다 : 'ObservableCollection _matches = new ObservableCollection (); var cvs = CollectoinViewSource.GetDefaultView (_matches); cvs.Filter = ...'GetDefaultView() 메서드는 정적이지만 정적이 아닌 인수를 전달할 수 있습니다. – rmc00

+0

좋아요, .Filter 예를 들어있는 것처럼 'FilterString'과 같은 속성을 전달해야합니다. – AgainMe

관련 문제