RM
This commit is contained in:
parent
2372ab4295
commit
38ac6e817a
119
README.md
119
README.md
@ -55,30 +55,120 @@ PM> Install-Package [ObservableCollections](https://www.nuget.org/packages/Obser
|
||||
create new `ObservableList<T>`, `ObservableDictionary<TKey, TValue>`, `ObservableHashSet<T>`, `ObservableQueue<T>`, `ObservableStack<T>`, `ObservableRingBuffer<T>`, `ObservableFixedSizeRingBuffer<T>`.
|
||||
|
||||
```csharp
|
||||
// Blazor simple sample.
|
||||
public partial class Index : IDisposable
|
||||
// Basic sample, use like ObservableCollection<T>.
|
||||
// CollectionChanged observes all collection modification
|
||||
var list = new ObservableList<int>();
|
||||
list.CollectionChanged += List_CollectionChanged;
|
||||
|
||||
list.Add(10);
|
||||
list.Add(20);
|
||||
list.AddRange(new[] { 10, 20, 30 });
|
||||
|
||||
static void List_CollectionChanged(in NotifyCollectionChangedEventArgs<int> e)
|
||||
{
|
||||
ObservableList<int> list;
|
||||
public ISynchronizedView<int, int> ItemsView { get; set; }
|
||||
switch (e.Action)
|
||||
{
|
||||
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<int>();
|
||||
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<T> : ComponentBase, IDisposable
|
||||
{
|
||||
[Parameter, EditorRequired]
|
||||
public IReadOnlyList<T> Items { get; set; } = default!;
|
||||
|
||||
[Parameter, EditorRequired]
|
||||
public Func<T, Cell[]> DataTemplate { get; set; }
|
||||
|
||||
ISynchronizedView<T, Cell[]> view = default!;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
list = new ObservableList<int>();
|
||||
ItemsView = list.CreateView(x => x);
|
||||
|
||||
ItemsView.CollectionStateChanged += action =>
|
||||
// TODO: CreateSortedView
|
||||
if (Items is IObservableCollection<T> observableCollection)
|
||||
{
|
||||
InvokeAsync(StateHasChanged);
|
||||
view = observableCollection.CreateView(DataTemplate);
|
||||
}
|
||||
else
|
||||
{
|
||||
var freezedList = new FreezedList<T>(Items);
|
||||
view = freezedList.CreateView(DataTemplate);
|
||||
}
|
||||
|
||||
view.CollectionStateChanged += async _ =>
|
||||
{
|
||||
await InvokeAsync(StateHasChanged);
|
||||
};
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ItemsView.Dispose();
|
||||
// unsubscribe.
|
||||
view.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
// .razor, iterate view
|
||||
@foreach (var (row, cells) in view)
|
||||
{
|
||||
<tr>
|
||||
@foreach (var item in cells)
|
||||
{
|
||||
<td>
|
||||
<CellView Item="item" />
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
```
|
||||
|
||||
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<int> eventArgs)
|
||||
{
|
||||
if (changedKind == ChangedKind.Add)
|
||||
{
|
||||
@ -173,6 +266,7 @@ TODO: write more usage...
|
||||
View/SoretedView
|
||||
---
|
||||
|
||||
|
||||
Filter
|
||||
---
|
||||
|
||||
@ -182,9 +276,6 @@ Collections
|
||||
Freezed
|
||||
---
|
||||
|
||||
Unity
|
||||
---
|
||||
|
||||
|
||||
License
|
||||
---
|
||||
|
@ -3,6 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<LangVersion>10.0</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
|
@ -1,16 +1,24 @@
|
||||
using ObservableCollections;
|
||||
using System;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace ConsoleApp
|
||||
|
||||
// Basic sample, use like ObservableCollection<T>.
|
||||
// CollectionChanged observes all collection modification
|
||||
var list = new ObservableList<int>();
|
||||
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<int>();
|
||||
|
||||
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();
|
Loading…
x
Reference in New Issue
Block a user