2010-08-17 87 views
11

我正在使用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> 

這裏是我的代碼behing(請不要;介意這個代碼後,在實際應用中,我使用的最佳MVVM爲這種情況)。

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); 
     } 
    } 

問題: 我需要寫「SetSummary」的方法,其特徵在於,我可以得到「initialCount」,並從CollectionViewSource對象「filteredCount」的幫助。

感謝您的關注。

回答

6

源集合和collectionview都實現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 2017-02-13 12:52:36

2

如果你在做MVVM,你可以讓你的虛擬機創建一個集合視圖,而不是由你的代表CollectionViewSource創建一個。然後,您可以控制創建什麼類型的CVS,因此您可以創建一個ListCollectionViewSource,它具有Count屬性。這實際上取決於您要過濾的數據的屬性。

+0

對不起,我無法得到它。你能否在上下文中用我的代碼解釋一些代碼。謝謝。 – 2010-08-17 10:08:39

32

你也可以做原始_viewSource.View.Cast<object>().Count()的過濾列表和_viewSource.View.SourceCollection.Cast<object>().Count()

+0

感謝您澄清如何獲取CollectionViewSource的過濾/排序內容。我是無法得到的CollectionViewSource的第一個項目,直到您的評論:VAR =與firstItem this.xViewInDescendingOrder.View.Cast ().ElementAt (0); – rfreytag 2016-05-27 11:08:26

8

我認爲更好的解決方案是像往常一樣,Linq!

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

......或者......

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

...如果你不知道的項目在運行時的類型!

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

描述你在你的例子中顯示的東西 – 2016-12-11 21:11:04

+0

通過這個,你可以計算出物品的數量,例如2,3 – EeNiArT 2016-12-12 14:39:27