如何从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
,为原始列表执行_viewSource.View.SourceCollection.Cast
。
我认为更好的解决方案就像往常一样,Linq!
_viewSource.View.Cast<[your_type]>().Count();
…要么…
_viewSource.View.Cast
…如果您在运行时不知道项目的类型!
如果您正在使用MVVM,则可以让您的VM创建集合视图,而不是CollectionViewSource
代表您创建集合视图。 然后,您可以控制创建的CVS类型,因此您可以创建具有Count
属性的ListCollectionViewSource
。 这实际上取决于您要过滤的数据的属性。
var count = DataGrid.ItemsSource.OfType
public static int Count(this ICollectionView view) { var index = 0; foreach (var unused in view) { index++; } return index; }