18

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);
        }
    }

質問: CollectionViewSource オブジェクトから "initialCount" と "filteredCount" を取得できる "SetSummary" メソッドを作成する際に助けが必要です。

ご関心をお寄せいただきありがとうございます。

4

6 に答える 6

46

_viewSource.View.Cast<object>().Count()フィルタリングされたリストと元のリストに対しても行うことができます_viewSource.View.SourceCollection.Cast<object>().Count()

于 2011-01-05T08:31:52.053 に答える
12

より良い解決策は、いつものようにLinqだと思います!

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

...また...

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

...実行時に項目のタイプがわからない場合!

于 2012-07-09T15:13:54.477 に答える
7

ソース コレクションとコレクションビューはどちらも 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++;
    }
}
于 2010-08-17T21:13:49.533 に答える
4

MVVM を実行している場合は、VM がコレクション ビューを作成するのではなく、CollectionViewSource. 次に、どのタイプの CVS を作成するかを制御できるのでListCollectionViewSource、プロパティを持つ を作成できCountます。それは、フィルタリングしているデータのプロパティに大きく依存します。

于 2010-08-17T09:57:03.180 に答える