GitHub is here: https://github.com/anagram4wander/VirtualizingObservableCollection
There are no performant large data set observable collections that support write operations in .NET, so we wrote the VirtualizingObservableCollection, which does the following:
◾Implements the same interfaces as ObsevableCollection<T> so you can use it anywhere you’d use an ObsevableCollection<T> – no need to change any of your existing controls.
◾Supports true multi-user read/write without resets (maximizing performance for large-scale concurrency scenarios).
◾Manages memory on its own so it never runs out of memory, no matter how large the data set is (especially important for mobile devices).
◾Natively works asynchronously – great for slow network connections and occasionally-connected models.
◾Works great out of the box, but is flexible and extendable enough to customize for your needs.
◾Has a data access performance curve nearly as good as the regular ObsevableCollection – the cost of using it is negligible.
◾Works in any .NET project because it’s implemented in a Portable Code Library (PCL).
Install-Package VirtualizingObservableCollection -Version 1.2.0
dotnet add package VirtualizingObservableCollection --version 1.2.0
<PackageReference Include="VirtualizingObservableCollection" Version="1.2.0" />
paket add VirtualizingObservableCollection --version 1.2.0
Fixed some timing bugs.
Made IndexOf async for a async provider.
Tweaked ResetAsync in the VOC. If you want to do Async resets (typically used for filters). This is the best method. Clear() actually will run sync rather than async.
Added a couple of interfaces you can put on a provider to make it more flexable:
IProviderPreReset - Adds a OnBeforeReset - aka a good place to clear stuff down.
IAsyncResetProvder - This will allow you to get the count of the reset async rather than sync for the Clear(). I would suggest you use ResetAsync() instead.
Can now support the insert and remove of millions of rows without effecting performance (yes - this is a real use case we needed).
Added ResetAsync which causes it to get it all again. This is great for filters.
Fixed broken count on non-async version.
Added base paged source, including MakeASync and MakeSync versions.
Fixed count bug when Async and the count returns instantly.
Fixed all Async to Sync context bugs (wrapped all .Results in Task.Run).
Greatly optimized if you do a lot of Inserts or Removes at the head of the VOC.
: do lots of add/insert/removes
} // Now does a reset.
Rewrote the core page/offset getter - works much better with large updates now.
Fixed a couple of ASync bugs related to cancelation.
Implemented Clear - so it does a reset/get count.
Minor change to Async GetPlaceHold to pass in the index
Re-worked the Add/Append implementation to create new pages..
Async seems stable now: Implement IPagedSourceProviderAsync<T> and pass that to the PagingManager constructor.
Changed rest of the DateTimes to Object so you can implement any type of IPageExpiryComparer you want.
This package has no dependencies.