From 0106be30a2ce06025c40375252a8b2d91ec66ea2 Mon Sep 17 00:00:00 2001 From: chinboy Date: Thu, 16 Jan 2025 15:05:10 +0800 Subject: [PATCH] Add InstancedBindingFactory --- .../Data/InstancedBindingFactory.cs | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/AtomUI.Base/Data/InstancedBindingFactory.cs diff --git a/src/AtomUI.Base/Data/InstancedBindingFactory.cs b/src/AtomUI.Base/Data/InstancedBindingFactory.cs new file mode 100644 index 000000000..92915185c --- /dev/null +++ b/src/AtomUI.Base/Data/InstancedBindingFactory.cs @@ -0,0 +1,59 @@ +using System.Reactive.Linq; +using Avalonia.Data; + +namespace AtomUI.Data; + +internal static class InstancedBindingFactory +{ + public static InstancedBinding CreateInstancedBinding(object source, + BindingMode mode, + BindingPriority priority = BindingPriority.LocalValue) + { + _ = source ?? throw new ArgumentNullException(nameof(source)); + if (mode == BindingMode.OneTime) + { + if (source is IObservable observable) + { + return InstancedBinding.OneTime(observable, priority); + } + return InstancedBinding.OneTime(Observable.Return(source), priority); + } else if (mode == BindingMode.OneWay) + { + if (source is IObservable observable) + { + return InstancedBinding.OneWay(observable, priority); + } + else + { + throw new ArgumentException("source type must be IObservable."); + } + } + else if (mode == BindingMode.OneWayToSource) + { + if (source is IObserver observer) + { + return InstancedBinding.OneWayToSource(observer, priority); + } + else + { + throw new ArgumentException("source type must be IObserver."); + } + } + else if (mode == BindingMode.TwoWay) + { + if (source is IObserver observer) + { + return InstancedBinding.OneWayToSource(observer, priority); + } + else + { + throw new ArgumentException("source type must be IObserver."); + } + } + else + { + throw new ArgumentException("mode must be OneTime, OneWay or OneWayToSource."); + } + } + +} \ No newline at end of file