如何从CollectionViewSource获取项目数?

我正在使用CollectionViewSource来过滤ListBox中显示的记录。 xaml如下。

          

这是我的代码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”方法,其中我可以从CollectionViewSource对象获取“initialCount”和“filteredCount”。

谢谢你的关注。

源集合和集合视图都实现了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++; } } 

您还可以为已过滤的列表执行_viewSource.View.SourceCollection.Cast().Count() ,为原始列表执行_viewSource.View.SourceCollection.Cast().Count()

我认为更好的解决方案就像往常一样,Linq!

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

…要么…

 _viewSource.View.Cast().Count(); 

…如果您在运行时不知道项目的类型!

如果您正在使用MVVM,则可以让您的VM创建集合视图,而不是CollectionViewSource代表您创建集合视图。 然后,您可以控制创建的CVS类型,因此您可以创建具有Count属性的ListCollectionViewSource 。 这实际上取决于您要过滤的数据的属性。

 var count = DataGrid.ItemsSource.OfType().Count(); 
 public static int Count(this ICollectionView view) { var index = 0; foreach (var unused in view) { index++; } return index; }