Я использую CollectionViewSource для фильтрации записей, отображаемых в ListBox. Далее следует xaml.
<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>
А вот и мой код (пожалуйста, не обращайте внимания на этот код, Мне нужна помощь в написании метода «SetSummary», в котором я могу получить «initialCount» и «FilterCount» из объекта CollectionViewSource.
Спасибо за ваш интерес.
И исходная коллекция, и просмотр коллекции реализуют 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++;
}
}
Если вы выполняете MVVM, ваша виртуальная машина может создать представление коллекции, а не то, которое создается от вашего имени с помощью CollectionViewSource
. Затем вы можете контролировать, какой тип CVS создается, поэтому вы можете создать ListCollectionViewSource
, который имеет свойство Count
. Это действительно зависит от свойств фильтруемых данных.