OptionalonOptionalonCalled when the names this collection holds, or the regions they designate, change.
Not a per-item change event: editing a name's comment or hiding it does not surface here, and a consumer wanting that listens to the item.
What a name refers to does surface, though — it is part of what the collection holds, and a consumer asking "what is this region called?" (INamedCollection.getByRanges) has nowhere else to hear about it. It cannot subscribe to an item it does not yet hold, and defining a name is two steps: it is added, and then bound to a region. Both are announced, as are a redefinition and an undo that moves one. So this can fire more than once for a single definition, and a listener that re-reads the collection is the intended response.
OptionalonCalled when an undo or a redo has moved what this collection presents, and a consumer holding it needs to re-read.
Separate from onCollectionChange because a restore is not a write, and some listeners treat the two very differently: the calculation engine recalculates on a change, and firing that for a restore would recalculate a second time on top of the one the restore already did. A consumer rendering a LIST wants both, and subscribes to both.
A derived name is what makes this necessary. A table's name is read back off the table rather than stored here, so an undo of a rename moves no state of this collection's and a change-only listener hears nothing.
Transaction items have a close event.