相关疑难解决方法(0)

清除ObservableCollection时,e.OldItems中没有项目

我这里有些东西让我措手不及.

我有一个带有项目的Ob的ObservableCollection.我还有一个附加到CollectionChanged事件的事件处理程序.

当您清除集合,将导致以e.Action的CollectionChanged事件设置为NotifyCollectionChangedAction.Reset.好的,这很正常.但奇怪的是,e.OldItems或e.NewItems都没有任何内容.我希望e.OldItems可以填充从集合中删除的所有项目.

有没有人见过这个?如果是这样,他们是如何绕过它的?

一些背景:我使用CollectionChanged事件来附加和分离另一个事件,因此如果我没有在e.OldItems中获取任何项目......我将无法从该事件中分离出来.


澄清: 我知道文档并没有完全声明它必须以这种方式行事.但对于其他所有行动,它都会告诉我它做了什么.所以,我的假设是它会告诉我......在清除/重置的情况下.


如果您希望自己重现,下面是示例代码.首先关闭xaml:

<Window
    x:Class="ObservableCollection.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1"
    Height="300"
    Width="300"
>
    <StackPanel>
        <Button x:Name="addButton" Content="Add" Width="100" Height="25" Margin="10" Click="addButton_Click"/>
        <Button x:Name="moveButton" Content="Move" Width="100" Height="25" Margin="10" Click="moveButton_Click"/>
        <Button x:Name="removeButton" Content="Remove" Width="100" Height="25" Margin="10" Click="removeButton_Click"/>
        <Button x:Name="replaceButton" Content="Replace" Width="100" Height="25" Margin="10" Click="replaceButton_Click"/>
        <Button x:Name="resetButton" Content="Reset" Width="100" Height="25" Margin="10" Click="resetButton_Click"/>
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

接下来,代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media; …
Run Code Online (Sandbox Code Playgroud)

wpf observablecollection

89
推荐指数
6
解决办法
4万
查看次数

如何在ObservableCollection上引发CollectionChanged事件,并将更改的项目传递给它?

我有一个继承自的类,ObservableCollection并添加了一些其他方法,如AddRangeRemoveRange

我的基本方法调用是这样的:

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我想要访问e.NewItems或者e.OldItemsCollectionChanged事件中对集合中的任何项目执行操作,并且NotifyCollectionChangedAction.Reset操作不会传递这些值

void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null) // e.NewItems is always null
    {
        foreach (var item in e.NewItems)
        {
            if (item is EventInstanceModel)
                ((EventInstanceModel)item).ParentEvent = this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我认为我可以使用NotifyCollectionChangedAction.Add而不是Reset,但是会引发Range actions are not supported异常

public void AddRange(IEnumerable<T> collection)
{
    var addedItems …
Run Code Online (Sandbox Code Playgroud)

c# wpf observablecollection inotifycollectionchanged

26
推荐指数
2
解决办法
4万
查看次数