9

6 列の DataGrid で最大 3000 項目の ObservableCollection をフィルター処理したいと考えています。ユーザーは「&&」方式で 6 列すべてをフィルタリングできる必要があります。

LINQ または CollectionView を使用する必要がありますか? LINQ は、いくつかの www サンプルを試すとより高速に見えました。長所/短所はありますか?

更新

private ObservableCollection<Material> _materialList;
        private ObservableCollection<Material> _materialListInternal;

        public MaterialBrowserListViewModel()
        {           
              _materialListInternal = new ObservableCollection<Material>();          

            for (int i = 0; i < 2222; i++)
            {
                var mat = new Material()
                {
                    Schoolday = DateTime.Now.Date,
                    Period = i,
                    DocumentName = "Excel Sheet" + i,
                    Keywords = "financial budget report",
                    SchoolclassCode = "1",
                };
                _materialListInternal.Add(mat);
                var mat1 = new Material()
                {
                    Schoolday = DateTime.Now.Date,
                    Period = i,
                    DocumentName = "Word Doc" + i,
                    Keywords = "Economical staticstics report",
                    SchoolclassCode = "2",
                };
                _materialListInternal.Add(mat1);
            }

            MaterialList = CollectionViewSource.GetDefaultView(MaterialListInternal);
            MaterialList.Filter = new Predicate<object>(ContainsInFilter); 
        }      

        public bool ContainsInFilter(object item)
        {
            if (String.IsNullOrEmpty(FilterKeywords))
                return true;   

            Material material = item as Material;
            if (DocumentHelper.ContainsCaseInsensitive(material.Keywords,FilterKeywords,StringComparison.CurrentCultureIgnoreCase))        
                return true;          
            else          
                return false;                     
        }

        private string _filterKeywords;
        public string FilterKeywords
        {
            get { return _filterKeywords; }
            set
            {
                if (_filterKeywords == value)
                    return;

                _filterKeywords = value;
                this.RaisePropertyChanged("FilterKeywords");
                MaterialList.Refresh();               
            }
        }

        public ICollectionView MaterialList { get; set; }

        public ObservableCollection<Material> MaterialListInternal
        {
            get { return _materialListInternal; }
            set
            {
                _materialListInternal = value;
                this.RaisePropertyChanged("MaterialList");
            }
        } 
4

5 に答える 5

3
  • ICollectionViewを使用すると、Refreshを呼び出したときにコレクションの変更が自動的に通知されます。LINQを使用すると、UIを更新するためにフィルターを再実行する必要があるときに、独自の変更通知を発行する必要があります。難しいことではありませんが、単にリフレッシュを呼び出すよりも少し考えが必要です。

  • LINQは、ICollectionViewで使用される単純なyes / noフィルタリングよりも柔軟性がありますが、複雑なことを行わない場合は、その柔軟性に実際には何の利点もありません。

  • ヘンクが述べたように、UIに目立ったパフォーマンスの違いはないはずです。

于 2010-10-06T02:29:30.943 に答える
1

インタラクティブな (DataGrid?) エクスペリエンスには、おそらく CollectionView を使用する必要があります。よりコード指向の並べ替えには、LINQ.

また、最大 3000 個のアイテムを使用すると、速度が UI の (主要な) 要因になることはありません。

于 2010-10-05T20:35:28.747 に答える
0

Refresh メソッドがビュー全体を再作成するため、視覚的な複雑さとアイテムの数に基づいて、実際には顕著なパフォーマンスの違いがあります!!!

于 2018-03-14T15:43:11.350 に答える