From 7dd822fc9b41f4d70c3b655a2a7df672f5d549c6 Mon Sep 17 00:00:00 2001 From: neuecc Date: Fri, 3 Sep 2021 18:26:37 +0900 Subject: [PATCH] ya --- README.md | 92 +++++++++++++++++++++++++- sandbox/BlazorApp/Pages/Index.razor.cs | 24 +++---- 2 files changed, 100 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 22185a8..3aa0f20 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,30 @@ 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 +{ + ObservableList list; + public ISynchronizedView ItemsView { get; set; } + protected override void OnInitialized() + { + list = new ObservableList(); + ItemsView = list.CreateView(x => x); + ItemsView.CollectionStateChanged += action => + { + InvokeAsync(StateHasChanged); + }; + } - + public void Dispose() + { + ItemsView.Dispose(); + } +} +``` ```csharp // WPF simple sample. @@ -71,7 +91,6 @@ public MainWindow() this.DataContext = this; list = new ObservableList(); - list.AddRange(new[] { 1, 10, 188 }); ItemsView = list.CreateSortedView(x => x, x => x, comparer: Comparer.Default).WithINotifyCollectionChanged(); BindingOperations.EnableCollectionSynchronization(ItemsView, new object()); // for ui synchronization safety of viewmodel @@ -83,16 +102,83 @@ protected override void OnClosed(EventArgs e) } ``` +```csharp +// Unity, with filter sample. + +public class SampleScript : MonoBehaviour +{ + public Button prefab; + public GameObject root; + ObservableRingBuffer collection; + ISynchronizedView view; + + void Start() + { + collection = new ObservableRingBuffer(); + view = collection.CreateView(x => + { + var item = GameObject.Instantiate(prefab); + item.GetComponentInChildren().text = x.ToString(); + return item.gameObject; + }); + view.AttachFilter(new GameObjectFilter(root)); + } + + void OnDestroy() + { + view.Dispose(); + } + + public class GameObjectFilter : ISynchronizedViewFilter + { + readonly GameObject root; + + public GameObjectFilter(GameObject root) + { + this.root = root; + } + + public void OnCollectionChanged(ChangedKind changedKind, int value, GameObject view) + { + if (changedKind == ChangedKind.Add) + { + view.transform.SetParent(root.transform); + } + else if (changedKind == ChangedKind.Remove) + { + GameObject.Destroy(view); + } + } + + public bool IsMatch(int value, GameObject view) + { + return value % 2 == 0; + } + + public void WhenTrue(int value, GameObject view) + { + view.SetActive(true); + } + + public void WhenFalse(int value, GameObject view) + { + view.SetActive(false); + } + } +} +``` + TODO: write more usage... View/SoretedView --- +Filter +--- Collections --- - Unity --- diff --git a/sandbox/BlazorApp/Pages/Index.razor.cs b/sandbox/BlazorApp/Pages/Index.razor.cs index 45a68e3..d79fbb5 100644 --- a/sandbox/BlazorApp/Pages/Index.razor.cs +++ b/sandbox/BlazorApp/Pages/Index.razor.cs @@ -3,38 +3,36 @@ using ObservableCollections; namespace BlazorApp.Pages; -public partial class Index +public partial class Index : IDisposable { ObservableList list; public ISynchronizedView ItemsView { get; set; } int adder = 99; - - RenderFragment fragment; - protected override void OnInitialized() { list = new ObservableList(); - list.AddRange(new[] { 1, 10, 188 }); - ItemsView = list.CreateSortedView(x => x, x => x, comparer: Comparer.Default).WithINotifyCollectionChanged(); + ItemsView = list.CreateView(x => x); - - fragment = builder => + ItemsView.CollectionStateChanged += action => { - builder.GetFrames(); - + InvokeAsync(StateHasChanged); }; } - + public void Dispose() + { + ItemsView.Dispose(); + } + + + void OnClick() { ThreadPool.QueueUserWorkItem(_ => { list.Add(adder++); - - _ = InvokeAsync(StateHasChanged); }); } }