diff --git a/README.md b/README.md index 6d37c17..d61232e 100644 --- a/README.md +++ b/README.md @@ -55,30 +55,120 @@ PM> Install-Package [ObservableCollections](https://www.nuget.org/packages/Obser create new `ObservableList`, `ObservableDictionary`, `ObservableHashSet`, `ObservableQueue`, `ObservableStack`, `ObservableRingBuffer`, `ObservableFixedSizeRingBuffer`. ```csharp -// Blazor simple sample. -public partial class Index : IDisposable +// Basic sample, use like ObservableCollection. +// CollectionChanged observes all collection modification +var list = new ObservableList(); +list.CollectionChanged += List_CollectionChanged; + +list.Add(10); +list.Add(20); +list.AddRange(new[] { 10, 20, 30 }); + +static void List_CollectionChanged(in NotifyCollectionChangedEventArgs e) { - ObservableList list; - public ISynchronizedView ItemsView { get; set; } - - protected override void OnInitialized() + switch (e.Action) { - list = new ObservableList(); - ItemsView = list.CreateView(x => x); - - ItemsView.CollectionStateChanged += action => - { - InvokeAsync(StateHasChanged); - }; - } - - public void Dispose() - { - ItemsView.Dispose(); + case NotifyCollectionChangedAction.Add: + if (e.IsSingleItem) + { + Console.WriteLine(e.NewItem); + } + else + { + foreach (var item in e.NewItems) + { + Console.WriteLine(item); + } + } + break; + // Remove, Replace, Move, Reset + default: + break; } } ``` +Handling All CollectionChanged event manually is difficult. ObservableCollections has SynchronizedView that transform element for view. + +```csharp +var list = new ObservableList(); +var view = list.CreateView(x => x.ToString() + "$"); + +list.Add(10); +list.Add(20); +list.AddRange(new[] { 30, 40, 50 }); +list[1] = 60; +list.RemoveAt(3); + +foreach (var (_, v) in view) +{ + // 10$, 60$, 30$, 50$ + Console.WriteLine(v); +} + +// Dispose view is unsubscribe collection changed event. +view.Dispose(); +``` + +Blazor +--- + + + +```csharp +public partial class DataTable : ComponentBase, IDisposable +{ + [Parameter, EditorRequired] + public IReadOnlyList Items { get; set; } = default!; + + [Parameter, EditorRequired] + public Func DataTemplate { get; set; } + + ISynchronizedView view = default!; + + protected override void OnInitialized() + { + // TODO: CreateSortedView + if (Items is IObservableCollection observableCollection) + { + view = observableCollection.CreateView(DataTemplate); + } + else + { + var freezedList = new FreezedList(Items); + view = freezedList.CreateView(DataTemplate); + } + + view.CollectionStateChanged += async _ => + { + await InvokeAsync(StateHasChanged); + }; + } + + public void Dispose() + { + // unsubscribe. + view.Dispose(); + } +} + +// .razor, iterate view +@foreach (var (row, cells) in view) +{ + + @foreach (var item in cells) + { + + + + } + +} +``` + +WPF +--- + ```csharp // WPF simple sample. @@ -102,6 +192,9 @@ protected override void OnClosed(EventArgs e) } ``` +Unity +--- + ```csharp // Unity, with filter sample. @@ -138,7 +231,7 @@ public class SampleScript : MonoBehaviour this.root = root; } - public void OnCollectionChanged(ChangedKind changedKind, int value, GameObject view) + public void OnCollectionChanged(ChangedKind changedKind, int value, GameObject view, in NotifyCollectionChangedEventArgs eventArgs) { if (changedKind == ChangedKind.Add) { @@ -173,6 +266,7 @@ TODO: write more usage... View/SoretedView --- + Filter --- @@ -182,9 +276,6 @@ Collections Freezed --- -Unity ---- - License --- diff --git a/sandbox/ConsoleApp/ConsoleApp.csproj b/sandbox/ConsoleApp/ConsoleApp.csproj index 9d80c7b..241e36b 100644 --- a/sandbox/ConsoleApp/ConsoleApp.csproj +++ b/sandbox/ConsoleApp/ConsoleApp.csproj @@ -3,6 +3,7 @@ Exe net6.0 + 10.0 enable diff --git a/sandbox/ConsoleApp/Program.cs b/sandbox/ConsoleApp/Program.cs index 04ad310..564fbcd 100644 --- a/sandbox/ConsoleApp/Program.cs +++ b/sandbox/ConsoleApp/Program.cs @@ -1,16 +1,24 @@ using ObservableCollections; using System; +using System.Collections.Specialized; -namespace ConsoleApp + +// Basic sample, use like ObservableCollection. +// CollectionChanged observes all collection modification +var list = new ObservableList(); +var view = list.CreateView(x => x.ToString() + "$"); + +list.Add(10); +list.Add(20); +list.AddRange(new[] { 30, 40, 50 }); +list[1] = 60; +list.RemoveAt(3); + +foreach (var (_, v) in view) { - class Program - { - static void Main(string[] args) - { - var oc = new ObservableList(); - - oc.AddRange(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.AsEnumerable()); - - } - } + // 10$, 60$, 30$, 50$ + Console.WriteLine(v); } + +// Dispose view is unsubscribe collection changed event. +view.Dispose(); \ No newline at end of file