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