wabbajack/Wabbajack.App/Extensions/IObservableExtensions.cs

63 lines
2.0 KiB
C#
Raw Normal View History

2021-09-27 12:42:46 +00:00
using System;
2021-11-02 13:40:59 +00:00
using System.Linq.Expressions;
2021-09-27 12:42:46 +00:00
using System.Reactive.Disposables;
2021-11-02 13:40:59 +00:00
using System.Reactive.Linq;
2021-09-27 12:42:46 +00:00
using System.Reactive.Subjects;
using System.Threading.Tasks;
2021-11-02 13:40:59 +00:00
using Microsoft.CodeAnalysis.CSharp.Syntax;
using ReactiveUI;
2021-11-05 11:47:14 +00:00
using Wabbajack.App.Controls;
using Wabbajack.Paths;
2021-09-27 12:42:46 +00:00
2021-10-23 16:51:17 +00:00
namespace Wabbajack.App.Extensions;
public static class IObservableExtensions
2021-09-27 12:42:46 +00:00
{
2021-11-02 13:40:59 +00:00
public static IDisposable SimpleOneWayBind<TView, TViewModel, TProp, TOut>(
this TView view,
TViewModel? viewModel,
Expression<Func<TViewModel, TProp?>> vmProperty,
Expression<Func<TView, TOut?>> viewProperty)
where TView : class
{
var d = viewModel.WhenAny(vmProperty, change => change.Value)
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(view, viewProperty);
return Disposable.Create(() => d.Dispose());
}
public static IDisposable SimpleOneWayBind<TView, TViewModel, TProp, TOut>(
this TView view,
TViewModel? viewModel,
Expression<Func<TViewModel, TProp?>> vmProperty,
Expression<Func<TView, TOut?>> viewProperty,
Func<TProp?, TOut> selector)
where TView : class
{
var d = viewModel.WhenAnyValue(vmProperty)
.Select(change => selector(change))
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(view, viewProperty);
return Disposable.Create(() => d.Dispose());
}
2021-11-05 11:47:14 +00:00
public static IDisposable BindFileSelectionBox<TViewModel>(this FileSelectionBox box, TViewModel viewModel,
Expression<Func<TViewModel, AbsolutePath>> vmProperty)
where TViewModel: class?
{
var disposables = new CompositeDisposable();
box.WhenAnyValue(view => view.SelectedPath)
.BindTo(viewModel, vmProperty)
.DisposeWith(disposables);
viewModel.WhenAnyValue(vmProperty)
.Where(p => p != default)
.Subscribe(box.Load)
.DisposeWith(disposables);
return disposables;
}
2021-09-27 12:42:46 +00:00
}