c# - 实现 CollectionChanged

标签 c# wpf mvvm mvvm-light

我已将 CollectionChanged eventhandler(onCollectionChanged) 添加到 ObservableCollection 属性之一。

我发现 onCollectionChanged 方法仅在向集合中添加项目或删除项目时被调用,但在编辑集合项目时不会被调用。

我想知道如何在单个集合中发送新添加、删除和编辑的项目的列表/集合。

谢谢。

最佳答案

您必须为每个项目添加一个 PropertyChanged 监听器(必须实现 INotifyPropertyChanged)以获取有关编辑可观察列表中对象的通知。

public ObservableCollection<Item> Names { get; set; }
public List<Item> ModifiedItems { get; set; }

public ViewModel()
{
   this.ModifiedItems = new List<Item>();

   this.Names = new ObservableCollection<Item>();
   this.Names.CollectionChanged += this.OnCollectionChanged;
}

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        foreach(Item newItem in e.NewItems)
        {
            ModifiedItems.Add(newItem);

            //Add listener for each item on PropertyChanged event
            newItem.PropertyChanged += this.OnItemPropertyChanged;         
        }
    }

    if (e.OldItems != null)
    {
        foreach(Item oldItem in e.OldItems)
        {
            ModifiedItems.Add(oldItem);

            oldItem.PropertyChanged -= this.OnItemPropertyChanged;
        }
    }
}

void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    Item item = sender as Item;
    if(item != null)
       ModifiedItems.Add(item);
}

也许您必须检查某些项目是否已经在 ModifedItems-List 中(使用 List 的方法 Contains(object obj)),并且只有在该方法的结果为 false.

Item 类必须实现 INotifyPropertyChanged。看这个example知道怎么做。正如 Robert Rossney 所说,如果您有此要求,您也可以使用 IEditableObject 来实现。

关于c# - 实现 CollectionChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588359/

相关文章:

azure - viewmodel 构造函数中的 mvvm light 异步调用

c# - 与 MVVM 文本框中的自定义对象绑定(bind)

wpf - 如何在 WPF 中的 TextBlock 的句子中间插入绑定(bind)?

c# - 可以通过在WPF中平滑地改变字体粗细来脉冲文本吗?

wpf - 如何使用 MVVM 将数据绑定(bind)到 DataGrid 中的 DataGridComboBoxColumn

mvvm - SwiftUI: View 模型不会更新 View

c# - 我在 C# 中声明了一个变量,但不能在 switch 语句中使用它

c# - 如何通过单击任务栏来检测应用程序是否被激活

c# - 如何创建 Microsoft.AspNetCore.Http.HttpRequest 的实例进行测试?

c# - 如何使用 NServiceBus 执行集成测试?