【解決方法】WPFのリストコレクションビューで項目の変更を即座に検出するにはどうすればよいですか?


こんにちは。ListCollectionView を ComboBox の ItemsSource として使用する WPF アプリケーションがあります。 この ListCollectionView は主に AudioDevice クラスから設定されます。 実は以前、AudioDeviceクラスをベースにListを作成していました。 私のListcollectionviewは非常に完璧に動作しています。 しかし、アプリケーションの実行時に項目の変更が行われたかどうかを検出したいのですか?

どうやってやるの? 覚えておくべき重要な点は、すべての作業を Codebehind から行っているということです。 このシナリオでは MVVM ベース アーキテクチャを使用しません。

これは、ListCollectionView を宣言する最後の部分のコード スニペットです。

ListCollectionView lcv = new(devices); lcv.GroupDescriptions.Add(new PropertyGroupDescription("Direction")); cmb1.ItemsSource = lcv;

私が試したこと:

を使用してこの問題を解決しようとします

INotifyCollectionChanged

しかし、そのコードは機能せず、実行時に変更を検出できません。

解決策 1

ドキュメントは非常に明確で、サポートされているイベントがリストされています。 ListCollectionView クラス (System.Windows.Data) | Microsoft Learn[^]。

あなたの場合、聞きたいのは、 コレクションが変更されました[^] イベント。

アップデート

対処方法は次のとおりです。 CollectionChanged イベント:

C#
private void OnCollectionChanged(
    object? sender,
    NotifyCollectionChangedEventArgs e)
{
    // any new items?
    if (e.NewItems?.Count > 0)
    {
        // Item(s) added
    }

    // any to remove? ... not required for this purpose.
    if (e.OldItems?.Count > 0)
    {
        // Item(s) removed
    }
}

解決策 2

それはコレクションの種類によると思います devices 変数は。 それがただの場合 List<> その場合、変更は UI に反映されません。 List<> コンテンツが変更されたときにイベントを発行しません。

おそらく 2 つの選択肢があります。

1) アップデートを入手するたびに devices リストを作成するには、新しいリストを作成してコンボボックスを更新する必要があります。 ListCollectionView そしてそれを cmb1.ItemsSource

2) ObservableCollection<> そしてそれをクラス内に保存します。 次に、 ListCollectionView これは、この監視可能なコレクションをソースとして使用し、監視可能なコレクションにデバイスのリストを設定します。 これは、監視可能なコレクションへの変更がすべてにも適用されることを意味します。 ListCollectionView 更新時に UI に適用する必要があります。

2 番目のオプションは、監視可能なコレクション内のエントリと一致するようにエントリを追加、更新、削除することを意味するため、より複雑になる可能性があります。 devices リスト。 結局のところ、あなたにとって最も簡単な選択肢が見つかるかもしれません。

コメント

タイトルとURLをコピーしました