我是C#和OOP的新手,只是一个关于NotifyCollectionChangedEventArgs
的问题。我不明白为什么它有NewItems和OldItems而不是NewItem
和OldItem
。
例如,我们将ObservableCollection用作:
ObservableCollection<Person> people = new ObservableCollection<Person>()
// Wire up the CollectionChanged event.
people.CollectionChanged += people_CollectionChanged;
static void people_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (Person p in e.NewItems)
{
Console.WriteLine(p.ToString());
}
}
}
因此,每次我们在集合中添加新的Person
时都是:
people.Add(new Person("John", "Smith", 32));
CollectionChanged
触发people_CollectionChanged
,所以e.NewItems
仅包含一个人(我刚刚添加的人),因此假设e.NewItems
可以有多个人是什么意思呢?项,因为它总是只能有一项?
答案 0 :(得分:3)
您要订阅的事件实际上是由INotifyCollectionChanged
界面定义的,并由ObservableCollection
实现。
虽然ObservableCollection
没有一次添加多个项目的方法,但确实有一个ClearItems
方法,该方法可以一次删除多个项目。这就是我想到复数名称的原因之一,因为它们可以包含多个项目。
此外,由于它是一个接口,因此可以由其他确实实现诸如AddRange
或RemoveWhere
等方法的类来实现,这将再次引发具有多个项目的事件。
答案 1 :(得分:1)
如果您查看official documentation,您会发现支持实体是IList
的实现。鉴于这是一个列表,所以属性名称是复数形式是很自然的。
例如,如果我使用AddRange
,将一次添加多个项目,并且NewItems
(如果删除了内容,则为OldItems
)将被填充多个条目