Added TrackedProperty for commiting and reverting values

This commit is contained in:
TheXamlGuy
2024-05-23 01:08:24 +01:00
parent f11370830f
commit 246dab4297
2 changed files with 48 additions and 12 deletions
+38 -12
View File
@@ -17,6 +17,8 @@ public partial class Observable :
IPublisherRequired,
IDisposerRequired
{
private readonly Dictionary<string, object> trackedProperties = [];
[ObservableProperty]
private bool isInitialized;
@@ -48,8 +50,13 @@ public partial class Observable :
public IPublisher Publisher { get; }
public virtual Task OnActivated() =>
Task.CompletedTask;
public void Commit()
{
foreach (object trackedProperty in trackedProperties.Values)
{
((dynamic)trackedProperty).Commit();
}
}
public Task Deactivate()
{
@@ -57,12 +64,6 @@ public partial class Observable :
return Task.CompletedTask;
}
public virtual Task OnDeactivated() =>
Task.CompletedTask;
public virtual Task OnDeactivating() =>
Task.CompletedTask;
public virtual void Dispose()
{
GC.SuppressFinalize(this);
@@ -79,13 +80,39 @@ public partial class Observable :
IsInitialized = true;
return Task.CompletedTask;
}
public virtual Task OnActivated() =>
Task.CompletedTask;
public virtual Task OnDeactivated() =>
Task.CompletedTask;
public virtual Task OnDeactivating() =>
Task.CompletedTask;
public void Revert()
{
foreach (object trackedProperty in trackedProperties.Values)
{
((dynamic)trackedProperty).Revert();
}
}
public void Track<T>(string propertyName, Func<T> getter, Action<T> setter)
{
if (!trackedProperties.ContainsKey(propertyName))
{
T initialValue = getter();
trackedProperties[propertyName] = new TrackedProperty<T>(initialValue, setter, getter);
}
}
}
public partial class Observable<TValue>(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
TValue? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{
@@ -93,7 +120,6 @@ public partial class Observable<TValue>(IServiceProvider provider,
private TValue? value = value;
}
public partial class Observable<TKey, TValue>(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
+10
View File
@@ -0,0 +1,10 @@
namespace Toolkit.Foundation;
public class TrackedProperty<T>(T initial,
Action<T> revert,
Func<T> commit)
{
public void Commit() => initial = commit();
public void Revert() => revert(initial);
}