如何立即检测 WPF 中的列表集合视图中的任何项目更改?


您好,我有一个 WPF 应用程序,其中使用 ListCollectionView 作为 ComboBox 的 ItemsSource。 此 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) | 微软学习[^]。

就您而言,您想听听 收藏已更改[^] 事件。

更新

以下是如何处理 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<> 当内容更改时不会发出事件。

您可能有两个选择:

1)每当您收到更新时 devices 列表,您必须通过创建一个新的来更新组合框 ListCollectionView 并将其分配给 cmb1.ItemsSource

2)创建一个 ObservableCollection<> 并将其存储在类中。 然后你可以创建一个 ListCollectionView 它使用此可观察集合作为源,然后使用设备列表填充可观察集合。 这意味着对可观察集合的任何更改也应该适用于 ListCollectionView 并应在更新时应用于 UI。

第二个选项可能比较棘手,因为它意味着添加、更新和/或删除可观察集合中的条目以匹配可观察集合中的条目 devices 列表。 这可能取决于对您来说最简单的选择。

コメント

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