This commit is contained in:
TheXamlGuy
2024-06-12 23:04:22 +01:00
parent c8f447251e
commit b155f5c6e2
40 changed files with 262 additions and 249 deletions
+60 -34
View File
@@ -9,7 +9,8 @@ namespace Toolkit.Foundation;
public partial class ObservableCollection<TItem> :
ObservableObject,
IObservableCollectionViewModel<TItem>,
IInitializer,
IPostInitialization,
IInitialization,
IActivated,
IDeactivating,
IDeactivated,
@@ -32,7 +33,7 @@ public partial class ObservableCollection<TItem> :
INotificationHandler<MoveToEventArgs<TItem>>,
INotificationHandler<ReplaceEventArgs<TItem>>,
INotificationHandler<SelectionEventArgs<TItem>>
where TItem : notnull,
where TItem : notnull,
IDisposable
{
private readonly System.Collections.ObjectModel.ObservableCollection<TItem> collection = [];
@@ -52,6 +53,8 @@ public partial class ObservableCollection<TItem> :
[ObservableProperty]
private bool initialized;
private bool postInitialized;
[ObservableProperty]
private TItem? selectedItem;
@@ -59,17 +62,16 @@ public partial class ObservableCollection<TItem> :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer)
{
Provider = provider;
Factory = factory;
Mediator = mediator;
Publisher = publisher;
Subscriber = subscriber;
Disposer = disposer;
subscriber.Add(this);
dispatcher = Provider.GetRequiredService<IDispatcher>();
collection.CollectionChanged += OnCollectionChanged;
}
@@ -78,7 +80,7 @@ public partial class ObservableCollection<TItem> :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer,
IEnumerable<TItem> items)
{
@@ -86,10 +88,9 @@ public partial class ObservableCollection<TItem> :
Factory = factory;
Mediator = mediator;
Publisher = publisher;
Subscriber = subscriber;
Disposer = disposer;
subscriber.Add(this);
dispatcher = Provider.GetRequiredService<IDispatcher>();
collection.CollectionChanged += OnCollectionChanged;
@@ -117,6 +118,7 @@ public partial class ObservableCollection<TItem> :
public IServiceProvider Provider { get; private set; }
public IPublisher Publisher { get; private set; }
public ISubscriber Subscriber { get; }
object ICollection.SyncRoot => this;
@@ -149,18 +151,19 @@ public partial class ObservableCollection<TItem> :
where T :
TItem
{
T? item = Factory.Create<T>(parameters);
T? item = Factory.Create<T>(args =>
{
if (args is IPostInitialization initialization)
{
initialization.PostInitialize();
}
}, parameters);
Add(item);
return item;
}
public void Clear(Action<ObservableCollection<TItem>> factory)
{
Clear();
factory.Invoke(this);
}
public void Add(TItem item)
{
int index = collection.Count;
@@ -200,6 +203,11 @@ public partial class ObservableCollection<TItem> :
}
}
public void Clear(Action<ObservableCollection<TItem>> factory)
{
Clear();
factory.Invoke(this);
}
public void Clear()
{
clearing = true;
@@ -246,17 +254,6 @@ public partial class ObservableCollection<TItem> :
Disposer.Dispose(this);
}
public void Fetch(bool reset = false)
{
if (reset)
{
Clear();
}
SynchronizeExpression expression = BuildAggregateExpression();
Publisher.PublishUI(expression.Value, expression.Key);
}
public void Fetch(Func<SynchronizeExpression> aggregateDelegate,
bool reset = false)
{
@@ -268,6 +265,7 @@ public partial class ObservableCollection<TItem> :
SynchronizeExpression expression = aggregateDelegate.Invoke();
Publisher.PublishUI(expression.Value, expression.Key);
}
public IEnumerator<TItem> GetEnumerator() =>
collection.GetEnumerator();
@@ -413,7 +411,7 @@ public partial class ObservableCollection<TItem> :
}
Initialized = true;
Fetch();
Synchronize();
return Task.CompletedTask;
}
@@ -423,14 +421,21 @@ public partial class ObservableCollection<TItem> :
where T :
TItem
{
T? item = Factory.Create<T>(parameters);
T? item = Factory.Create<T>(args =>
{
if (args is IPostInitialization initialization)
{
initialization.PostInitialize();
}
}, parameters);
InsertItem(index, item);
UpdateSelection(item);
return item;
}
public void Insert(int index,
public void Insert(int index,
TItem item)
{
InsertItem(index, item);
@@ -516,6 +521,17 @@ public partial class ObservableCollection<TItem> :
public virtual Task OnDeactivating() =>
Task.CompletedTask;
public virtual void PostInitialize()
{
if (postInitialized)
{
return;
}
postInitialized = true;
Subscriber.Subscribe(this);
}
public bool Remove(TItem item)
{
int index = collection.IndexOf(item);
@@ -574,6 +590,16 @@ public partial class ObservableCollection<TItem> :
}
}
public void Synchronize(bool reset = false)
{
if (reset)
{
Clear();
}
SynchronizeExpression expression = BuildAggregateExpression();
Publisher.PublishUI(expression.Value, expression.Key);
}
public void Track<T>(string propertyName, Func<T> getter, Action<T> setter)
{
if (!trackedProperties.ContainsKey(propertyName))
@@ -657,7 +683,7 @@ public partial class ObservableCollection<TValue, TViewModel>(IServiceProvider p
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer,
TValue value) : ObservableCollection<TViewModel>(provider, factory, mediator, publisher, subscriber, disposer)
where TViewModel : notnull, IDisposable
@@ -690,7 +716,7 @@ public partial class ObservableCollection<TViewModel, TKey, TValue> :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer,
TKey key,
TValue value) : base(provider, factory, mediator, publisher, subscriber, disposer)
@@ -703,7 +729,7 @@ public partial class ObservableCollection<TViewModel, TKey, TValue> :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer,
IEnumerable<TViewModel> items,
TKey key,
@@ -728,7 +754,7 @@ public class ObservableCollection :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
}
@@ -737,7 +763,7 @@ public class ObservableCollection :
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
ISubscriber subscriber,
IDisposer disposer,
IEnumerable<IDisposable> items) : base(provider, factory, mediator, publisher, subscriber, disposer, items)
{