2010-08-17 2 views
11

ListView에 표시된 레코드를 필터링하기 위해 CollectionViewSource를 사용하고 있습니다. xaml이 뒤 따른다.CollectionViewSource에서 항목 수를 계산하는 방법은 무엇입니까?

<Window x:Class="WPFStarter.ListBoxItemsFilter.ListBoxFilterUsingCollectionViewSource" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="userControl" 
     Title="ListBoxFilterUsingCollectionViewSource" Height="300" Width="300"> 
     <Window.Resources> 
     <CollectionViewSource Source="{Binding ElementName=userControl, Path=DataContext.Items}" 
           x:Key="cvs" Filter="CollectionViewSource_Filter"/> 
     </Window.Resources> 
    <StackPanel Orientation="Vertical"> 
     <TextBox x:Name="txtSearch" TextChanged="txtSearch_TextChanged"/> 
     <TextBlock x:Name="txtSummary" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="8"></TextBlock> 
     <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="First"/> 
    </StackPanel> 

</Window> 

그리고 여기가 (; t 코드 숨김이 마음 실제 응용 프로그램에서 내가이 시나리오 MVVM의 최선을 사용하고 돈하시기 바랍니다) 내 코드 behing입니다.

public partial class ListBoxFilterUsingCollectionViewSource : Window 
    { 
     private string _text=""; 
     private readonly CollectionViewSource _viewSource; 

     public ListBoxFilterUsingCollectionViewSource() 
     { 
      InitializeComponent(); 
      _viewSource = this.FindResource("cvs") as CollectionViewSource; 
     } 

     private void CollectionViewSource_Filter(object sender, FilterEventArgs e) 
     { 
      var character = e.Item as Character; 
      e.Accepted = character != null && character.First.ToLower().Contains(_text.ToLower()); 
     } 

     private void txtSearch_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      _text = txtSearch.Text; 
      _viewSource.View.Refresh(); 

      SetSummary(); 
     } 

     private void SetSummary() 
     {     
      var initialCount = 10; //HELP???? 
      var filteredCount = 10; //HELP???? 
      txtSummary.Text = String.Format("{0} of {1}", filteredCount, initialCount); 
     } 
    } 

질문 : 내가 내가 "initialCount"및 CollectionViewSource 개체에서 "filteredCount"를 얻을 수있어서, "SetSummary"방법을 쓰기에 도움이 필요하십니까.

관심을 가져 주셔서 감사합니다.

답변

6

소스 컬렉션 및 컬렉션 뷰는 모두 IEnumerable을 구현하므로 항상 반복하여 반복 할 수 있습니다. 그러나 소스로 사용한 실제 컬렉션에 대한 액세스 권한이없는 경우에만이 작업을 수행하는 것이 좋습니다.

private void SetSummary() 
{ 
    int initialCount = 0; 
    foreach(var item in _viewSource.View.SourceCollection) 
    { 
     initialCount++; 
    } 

    int filteredCount = 0; 
    foreach (var item in _viewSource.View) 
    { 
     filteredCount++; 
    } 
} 
+1

visbile 항목이 필터링 된 항목의 수가 아닌 경우 filteredCount는 숫자입니다. – apc

2

MVVM을 사용하는 경우 VM을 대신하여 CollectionViewSource에 의해 생성 된 뷰가 아닌 컬렉션 뷰를 만들 수 있습니다. 그런 다음 어떤 유형의 CVS를 만들었는지 제어 할 수 있으므로 Count 속성이있는 ListCollectionViewSource을 만들 수 있습니다. 필터링하는 데이터의 속성에 따라 달라집니다.

+0

죄송합니다. 컨텍스트 내 코드를 사용하여 일부 코드로 설명해주십시오. 감사. –

32

또한 원래의 필터링 된 목록에 대한 _viewSource.View.Cast<object>().Count()_viewSource.View.SourceCollection.Cast<object>().Count()을 할 수 있습니다.

+0

CollectionViewSource의 필터링 된/정렬 된 내용을 가져 오는 방법을 명확히 해 주셔서 감사합니다. 귀하의 의견 때까지 CollectionViewSource에서 첫 번째 항목을 얻을 수 없습니다 : var firstItem = this.xViewInDescendingOrder.View.Cast () .ElementAt (0); – rfreytag

8

더 나은 해결책은 평소처럼, Linq라고 생각합니다!

_viewSource.View.Cast<[your_type]>().Count(); 

... 또는

_viewSource.View.Cast<object>().Count(); 

...

... 당신은 런타임에 항목의 유형을 모르는 경우!

2
var count = DataGrid.ItemsSource.OfType<object>().Count(); 
+0

귀하의 사례에 귀하가 보여주는 것을 묘사하십시오 –

+0

이것을 통해 당신은 아이템 수를 얻을 수 있습니다 출처 예 2, 3 – EeNiArT