When the node got removed, its header will be set to a sentinel object called DisconnectedItem, and the Items Changed event will be NotifyCollectionChangedAction.Reset.

Note that if you did a List.Clear() the NotifyCollectionChangedAction.Remove event will not be fire, only NotifyCollectionChangedAction.Reset will. So I find it the most reliable way to detect node removal.

One catch is that if the node has not been rendered (parent has never been expanded) then this event will not fire.