代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

如何从CollectionViewSource获取项目计数?

  •  14
  • Manish Basantani  · 技术社区  · 14 年前

    我正在使用CollectionViewSource筛选列表框中显示的记录。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”。

    谢谢你的关心。

    6 回复  |  直到 14 年前
        1
  •  7
  •   Wallstreet Programmer    14 年前

    源集合和集合视图都实现了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++;
        }
    }
    
        2
  •  45
  •   rhyek    14 年前

    _viewSource.View.Cast<object>().Count() 对于筛选的列表和 _viewSource.View.SourceCollection.Cast<object>().Count() 原版的。

        3
  •  12
  •   MAXE    12 年前

    我认为更好的解决办法是,像往常一样,林克!

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

    …或者。。。

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

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

        4
  •  4
  •   Tim Cooper    13 年前

    如果您正在执行MVVM,那么您可以让VM创建一个集合视图,而不是由 CollectionViewSource . 然后,您可以控制创建哪种类型的CV,以便可以创建 ListCollectionViewSource Count 财产。这实际上取决于要过滤的数据的属性。

        5
  •  2
  •   Robert Columbia yusuf dalal    8 年前
    var count = DataGrid.ItemsSource.OfType<object>().Count();
    
        6
  •  0
  •   Smagin Alexey    6 年前
    public static int Count(this ICollectionView view)
        {
            var index = 0;
            foreach (var unused in view)
            {
                index++;
            }
            return index;
        }