ListView without recycling VisualElements or reliable way to implement unbindItem

I am using a ListView for dynamic instantiation of VisualElements.

However, I did not set the unbindItem callback and thus expected the ListView not to recycle existing VisualElement instances, but rather create a new instance always.
Sadly, I had to realize that the ListView is reusing VisualElements although unbindItem has not been set.

Recycling VisualElements does not work for me because there is not simple way to unregister all callbacks of a VisualElement (see related thread). As a result, this would require a lot of tedious and error prone unregistering of callbacks.

Is there a way to disable reusing VisualElements in a ListView, such that I don’t need to implement unbindItem?
Maybe one can subclass ListView to achieve this?

As alternative, is there a reliable way to unregister all callbacks of a VisualElement, e.g. by iterating over all of them?

Even if you could do this easily, you probably wouldn’t want to since you wouldn’t be able distinguish between the callbacks that you added and the callbacks which were added internally by the element itself or a manipulator it depends on to function. Even the simple built-in Button element relies on several Pointer events, and if you were to unregister all callbacks you would prevent the button from functioning.

In cases where I’ve needed to do this, I save the callbacks created in bindItem in element.userdata, then do something like:

list.bindItem = (e, i) =>
{
    var field = e as TextField;
    if (field.userData != null)
    {
        field.UnregisterCallback(field.userData as EventCallback<ChangeEvent<string>>);
    }

    EventCallback<ChangeEvent<string>> onChanged = (evt) =>
    {
        // do something cool
    };
    field.RegisterCallback(onChanged);
    field.userData = onChanged;
};