none
CollectionViewSource の Filter 機能 RRS feed

  • 質問

  • 【開発環境】
    ・.Net Framework 4.8
    ・MVVM:Prism.Unity 8.0.0.1909
    ・ReactiveProperty 4.8.1

    【質問】

    ViewModelで、CollectionViewSource (SourceはReadOnlyReactiveCollection)を作成し、ViewのComboBox.ItemsSourceにBindしてます。結果、ReactiveCollection内のデータがすべてComboBoxに表示されています。

    そのソースをフィルタリングするため、Filterメソッドを追加して、プロパティに合わせてe.Accepted に True/Falseをそれぞれセットしたのですが、コンボボックスにはコレクション内のすべてのデータが表示されてしまいます。(フィルターが効いてません)

    フィルターの結果を反映するにはなにか他に設定が必要でしょうか?
    初歩的な質問ですがよろしくおねがいします。

    (ViewModelの定義)

    public ReadOnlyReactiveCollection<MyData> MyDataCollection { get; }
    
    public CollectionViewSource ComboBoxSource { get; set; }

    (VMコンストラクタ内のコード)

    // Modelと同期
    MyDataCollection = _mymodel.MyDataCollection.ToReadOnlyReactiveCollection().AddTo(Disposable);
    
    // ComboBox用 ViewSourceを生成
    ComboBoxSource = new CollectionViewSource() 
    { 
      Source = MyDataCollection,
    };
    // フィルター設定
    ComboBoxSource.Filter += (object sender, FilterEventArgs e) =>
    {
      if (e.Item is MyData data)
      {
        // フィルタリング
        e.Accepted = data.IsChecked;
        Debug.WriteLine($"{data.name}:{e.Accepted.ToString()}");
      }
    };

    (View)

    <ComboBox
      ItemsSource="{Binding ComboBoxSource.Source}"
      SelectedItem="{Binding SelectedData.Value, Mode=TwoWay}"/>


     ------------------------------------------------------------------------------------





    • 編集済み NIM5 2021年3月17日 11:32
    2021年3月17日 11:28

回答

  • ComboBoxSource.Sourceをバインドされていますが、Sourceプロパティは元となるコレクションを公開するプロパティです。

    Viewプロパティで公開されているほうを使用してください。

    • 回答としてマーク NIM5 2021年3月17日 13:27
    2021年3月17日 12:10

すべての返信

  • ComboBoxSource.Sourceをバインドされていますが、Sourceプロパティは元となるコレクションを公開するプロパティです。

    Viewプロパティで公開されているほうを使用してください。

    • 回答としてマーク NIM5 2021年3月17日 13:27
    2021年3月17日 12:10

  •  Hongliang さん

    早速のご返信、大変助かりました。ありがとうございます!
    Viewプロパティをバインドしたらフィルターした結果が列挙されました。

    自分でSourceに元コレクション代入してるんだからそりゃそうですよね…


    • 編集済み NIM5 2021年3月17日 13:30
    2021年3月17日 13:30