3

私は現在、ItemsSource が ObservableCollection に設定されている GridView を持っています。基盤となるデータの更新は、何もしなくても UI に反映されます。物事はうまくいっています。

ObservableCollection にフィルターを適用して特定のアイテムのみを表示する最もクリーンな方法は何ですか? 理想的には、ObservableCollection からアイテムを実際に削除したり、2 つの異なるコレクションを維持したりしたくありません。同期を維持することがより困難になるからです。CollectionViewSource は有望に見えましたが、Windows ストア アプリの実装にはフィルタリング機能がないようです (なぜ MS ????)。

4

3 に答える 3

1

私は自分の C# + XAML Windows 8 アプリでこの同じ問題を処理しました。Bindable LINQObtics、およびContinuous LINQの 3 つのオープンソース プロジェクトのいずれも、必要な機能を提供します。

CollectionViewSource に Windows 8 のフィルタリング機能が含まれていないのも同様に良いことです。とにかく、そのような機能をビュー モデルに配置することが望ましいからです。そうすることの主な利点は、Portable Class Library (PCL) としてパッケージ化されたビュー モデル (フィルタリングを含む) が、WPF、Silverlight、および Windows 8 プロジェクト間で移植可能になることです。

上記の 3 つのオープン ソース プロジェクトは興味深いものに見えましたが、私は独自のMVVM フレームワーク上に構築することでこのタスクを達成しました。私のフレームワークはすでに並べ替えをサポートしているため、フィルタリングは自然に追加されました。先月実装したReactive APIを使用すると、簡単に追加できました。フィルタリングを含む MVVM フレームワークの最新バージョンをまだアップロードしていません。上記の 3 つのオープン ソース プロジェクトのいずれもあなたに合わない場合はお知らせください。少し早めにアップロードできるようにします。

于 2013-02-22T23:31:23.303 に答える
0

LINQ を使用して、テンプレートのある種の MVVM を使用していると仮定します。

this.DefaultViewModel["GreaterThan10Items"] = originalList.Where(c => c.SomeProperty > 10)
    .Select(c => new {c.SomeProperty, c.OtherProperty});

または多分:

this.DefaultViewModel["Children"] = from query in originalList
                                     where query.age <10
                                     select new Person
                                     {
                                      age= query.age,
                                      name = query.Name
                                     };

もちろん、ItemViewSource を GreaterThan10Items にリンクし、GridView をその ItemViewSource にバインドする必要があります。

于 2012-12-08T18:51:59.923 に答える
0

私のObservableComputationsライブラリを使用できます。たとえば、特定のタイプの注文で bing を GridView にフィルター処理する場合は、次のようにします。

GridView.ItemsSource = OrdersObservableCollection
    .Filtering(o => o.Type == OrdersFilter.SelectedType)

OrdersObservableCollection が変更されるか、Order.Type プロパティが変更されると、GridView が自動的に更新されるようになりました。Oreder クラスが INotifyPropertyChanged を実装していることを確認します。

于 2019-11-21T13:06:10.490 に答える