我正在使用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>
这是我的代码惊吓(请不要介意这个代码隐藏,在实际的应用程序中我使用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”。
感谢您的关注。
答案 0 :(得分:38)
您也可以为已过滤的列表_viewSource.View.Cast<object>().Count()
和原始的_viewSource.View.SourceCollection.Cast<object>().Count()
。
答案 1 :(得分:10)
我认为更好的解决方案就像往常一样,Linq!
_viewSource.View.Cast<[your_type]>().Count();
...或...
_viewSource.View.Cast<object>().Count();
...如果您在运行时不知道项目的类型!
答案 2 :(得分: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++;
}
}
答案 3 :(得分:2)
如果你正在做MVVM,你可以让你的VM创建一个集合视图,而不是CollectionViewSource
代表你创建一个集合视图。然后,您可以控制创建的CVS类型,因此您可以创建具有ListCollectionViewSource
属性的Count
。这实际上取决于您要过滤的数据的属性。
答案 4 :(得分:2)
var count = DataGrid.ItemsSource.OfType<object>().Count();
答案 5 :(得分:0)
public static int Count(this ICollectionView view)
{
var index = 0;
foreach (var unused in view)
{
index++;
}
return index;
}