Table of Contents

Binding

using Rinku.Tracking.Binding;

public record Album(int Id, string Title);

List<Album> source = cnn.Query<List<Album>>("SELECT AlbumId AS Id, Title FROM albums ORDER BY AlbumId");
BindingTrackingList<IRuntimeTrackingItem<Album>> albums = source.ToBindingList();

The binding list adds binding behavior around the same generated edit and structural tracking state.

Typed contract

public interface IAlbumEdit : IRuntimeTrackingItem<Album>
{
    int Id { get; }
    string Title { get; set; }
}

BindingTrackingList<IAlbumEdit> albums = source.ToBindingList<Album, IAlbumEdit>();
albums[0].Title = "Kind of Blue";

BindingList source

BindingList<Album> source = new(existingAlbums);
BindingTrackingList<IRuntimeTrackingItem<Album>> albums = source.ToBindingList();

An IList<TOriginal> source uses a source-aware tracking context.

Custom runtime options

RuntimeTrackingOptions<Album> options = RuntimeTracking.CreateOptions<Album, IAlbumEdit>();
options.Member<int>(nameof(Album.Id)).ReadOnly();

BindingTrackingList<IAlbumEdit> albums = source.ToBindingList<Album, IAlbumEdit>(options);

Binding materialization applies binding support to a copy of the supplied runtime options.

Structural operations

IAlbumEdit added = albums.AddNew();
added.Title = "New album";

albums.RemoveAt(0);

Console.WriteLine(albums.AddedCount);
Console.WriteLine(albums.RemovedCount);

Tracking lists