关于ObservableCollection的一个疑问,大家一起讨论讨论

canglong13 2013-06-21 04:02:33
先上代码,再说疑问^_^

class Program
{
static void Main(string[] args)
{
ObservableCollection<string> strs = new ObservableCollection<string>();
strs.Add("123");
strs.CollectionChanged += new NotifyCollectionChangedEventHandler(strs_CollectionChanged);
strs.Clear();

Console.Read();
}

private static void strs_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
Console.WriteLine("NEW");
}

if (e.OldItems != null)
{
Console.WriteLine("OLD");
}
}
}

运行上面的程序,我们可以看到,并没有任何输出。通过调试运行发现,Clear触发了CollectionChanged事件,但是OldItems的值却为null。为什么要这样,难道不应该给出集合中的所有值么?(PS:看来Remove和Clear的实现机制是不一样的)
...全文
152 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
canglong13 2013-06-22
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:

clear时会执行下面
protected override void ClearItems()
{
    this.CheckReentrancy();
    base.ClearItems();
    this.OnPropertyChanged("Count");
    this.OnPropertyChanged("Item[]");
    this.OnCollectionReset();
}

this.OnCollectionReset();源码是
private void OnCollectionReset()
{
    this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

 NotifyCollectionChangedEventArgs的构造中并未对olditems做处理


它先base.ClearItems了,就无法获得集合中的元素了,所以在触发事件的时候也无法给出集合中原有的元素了。话说,你是咋找到源码的,能分享一下方法么?
bdmh 2013-06-21
  • 打赏
  • 举报
回复

clear时会执行下面
protected override void ClearItems()
{
    this.CheckReentrancy();
    base.ClearItems();
    this.OnPropertyChanged("Count");
    this.OnPropertyChanged("Item[]");
    this.OnCollectionReset();
}

this.OnCollectionReset();源码是
private void OnCollectionReset()
{
    this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

 NotifyCollectionChangedEventArgs的构造中并未对olditems做处理


吴青峰 2013-06-21
  • 打赏
  • 举报
回复
strs.Clear(); 触发了CollectionChanged事件,说明资源已经被释放了,OldItems当然为NUll了。 如果不想让它为null,就不用strs.Clear(); 这句话,去掉再调试看看。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧