10000 Improved INotifyCollectionChanged Handling · Issue #52 · dotnet/wpf · GitHub
[go: up one dir, main page]

Skip to content

Improved INotifyCollectionChanged Handling #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Grauenwolf opened this issue Dec 4, 2018 · 10 comments · May be fixed by #9568 or #10845
Open

Improved INotifyCollectionChanged Handling #52

Grauenwolf opened this issue Dec 4, 2018 · 10 comments · May be fixed by #9568 or #10845
Labels
🚧 work in progress Enhancement Requested Product code improvement that does NOT require public API changes/additions Performance Performance related issue
Milestone

Comments

@Grauenwolf
Copy link

This is a carry over from .NET Framework.

If INotifyCollectionChanged.CollectionChanged -> NotifyCollectionChangedEventArgs.NewItems has more than one item, most WPF controls will throw an exception.

The main reason for this original design is that ObservableCollection doesn't have an AddRange method and the controls assum that nothing else will support INotifyCollectionChanged.

@dotMorten
Copy link
Contributor

Yes! This has been extremely annoying. Being able to trigger one large change for a set of items without causing UI relayout over and over again would be a huge perf improvement. The interface completely supports this, but for some reason WPF never has. Currently our only choice is to trigger a reset event, which causes a complete relayout of all items.

@benaadams
Copy link
Member
benaadams commented Dec 4, 2018

The main reason for this original design is that ObservableCollection doesn't have an AddRange method

The following apis have been approved for Collection<T> and ObservableCollection<T> in .NET Core; though not implemented yet https://github.com/dotnet/corefx/issues/10752:

public partial class Collection<T>
{
    public void AddRange(IEnumerable<T> collection);
    public void InsertRange(int index, IEnumerable<T> collection);
    public void RemoveRange(int index, int count);
    public void ReplaceRange(int index, int count, IEnumerable<T> collection);

    // These are override by ObservableCollection<T> to raise the event:
    protected virtual void InsertItemsRange(int index, IEnumerable<T> collection);
    protected virtual void RemoveItemsRange(int index, int count);
    protected virtual void ReplaceItemsRange(int index, int count, IEnumerable<T> collection);
}

@dotMorten
Copy link
Contributor

The main reason for this original design is that ObservableCollection doesn't have an AddRange method

This isn't about ObservableCollection, but about INotifyCollectionChanged interface. Any collection can implement that interface and have add-range, or be adding items in "chunks" (like incrementally loading datasources etc)

@airbreather
Copy link
airbreather commented Dec 4, 2018

most WPF controls will throw an exception.

I was under the impression that it's "just" System.Windows.Data.CollectionView which would need to change, and that (in theory) something else could implement System.ComponentModel.ICollectionView to get the desired benefits.

Admittedly, however, I haven't tried it... am I mistaken?

Edit: that said, System.ComponentModel.ICollectionView itself extends System.Collections.Specialized.INotifyCollectionChanged, which makes me think that System.Windows.Data.CollectionView is likely to be just the most visible of, perhaps, many places that don't support batched changes...

@YZahringer
Copy link

Could be a 6.0.0 candidate? This currently blocks the range support in .net 6 ObservableCollection

@DamirLisak
Copy link

In this context, I would like to point out the following problem:
dotnet/efcore#12675
EF core uses ObservableHashSet that implements INotifyCollectionChanged. However, the ObservableHashSet is an unsorted collection and is not able to specify an index in the OldStartingIndex property for a Remove action. This leads to an exception at this point in the EnumerableCollectionView.cs:


In this case, the entire CollectionView would have to be reloaded.

@symbiogenesis
Copy link
symbiogenesis commented Jan 26, 2024

This is one of the top-requested features in all of the world of .NET, going back many years. Offering this is crucial.

@dotMorten
Copy link
Contributor
dotMorten commented Jul 5, 2024

Suggestion: We don't we log an issue for each control that have a problem with multi-item changes, and that way we can start chipping away at it and hopefully get to a point where we can add AddRange to ObservableCollection<T> ? This issue could then be the epic for the individual tasks.

@symbiogenesis
Copy link

@symbiogenesis
Copy link

@robertmclaws

@rchauhan18 rchauhan18 added the Performance Performance related issue label Jul 30, 2024
@Mrxx99 Mrxx99 linked a pull request Aug 13, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🚧 work in progress Enhancement Requested Product code improvement that does NOT require public API changes/additions Performance Performance related issue
Projects
None yet
9 participants
0