Use IDeclarativeProperty instead of IObservable

This commit is contained in:
2023-08-14 17:55:55 +02:00
parent 4381f1b47a
commit 335433562a
8 changed files with 105 additions and 59 deletions

View File

@@ -0,0 +1,36 @@
namespace DeclarativeProperty;
public class CombineAllProperty<T, TResult> : DeclarativePropertyBase<TResult>
{
private readonly List<IDeclarativeProperty<T>> _sources;
private readonly Func<IEnumerable<T>, Task<TResult?>> _combiner;
public CombineAllProperty(
IEnumerable<IDeclarativeProperty<T>> sources,
Func<IEnumerable<T>, Task<TResult?>> combiner,
Action<TResult?>? setValueHook = null) : base(setValueHook)
{
var sourcesList = sources.ToList();
_sources = sourcesList;
_combiner = combiner;
var initialValueTask = _combiner(sourcesList.Select(p => p.Value));
initialValueTask.Wait();
SetNewValueSync(initialValueTask.Result);
foreach (var declarativeProperty in sourcesList)
{
AddDisposable(declarativeProperty.Subscribe(OnSourceChanged));
}
}
private async Task OnSourceChanged(T? arg1, CancellationToken arg2) => await Update();
private async Task Update()
{
var values = _sources.Select(p => p.Value);
var result = await _combiner(values);
await SetNewValueAsync(result);
}
}

View File

@@ -93,4 +93,10 @@ public static class DeclarativePropertyExtensions
public static IDeclarativeProperty<T> Switch<T>(this IDeclarativeProperty<IDeclarativeProperty<T>?> from)
=> new SwitchProperty<T>(from);
public static IDeclarativeProperty<TResult?> CombineAll<T, TResult>(
this IEnumerable<IDeclarativeProperty<T>> sources,
Func<IEnumerable<T>, Task<TResult>> combiner,
Action<TResult?>? setValueHook = null)
=> new CombineAllProperty<T,TResult?>(sources, combiner, setValueHook);
}