diff --git a/src/ReactiveUI.Tests/ReactiveNotifyPropertyChangedMixinTest.cs b/src/ReactiveUI.Tests/ReactiveNotifyPropertyChangedMixinTest.cs index 917b340113..4a64574045 100755 --- a/src/ReactiveUI.Tests/ReactiveNotifyPropertyChangedMixinTest.cs +++ b/src/ReactiveUI.Tests/ReactiveNotifyPropertyChangedMixinTest.cs @@ -11,6 +11,7 @@ using ReactiveUI.Testing; using Xunit; using Microsoft.Reactive.Testing; +using System.Reactive; #if !MONO using System.Windows.Controls; @@ -22,6 +23,7 @@ public class TestWhenAnyObsViewModel : ReactiveObject { public ReactiveCommand Command1 { get; set; } public ReactiveCommand Command2 { get; set; } + public ReactiveCommand Command3 { get; set; } ReactiveList myListOfInts; public ReactiveList MyListOfInts { @@ -33,6 +35,7 @@ public TestWhenAnyObsViewModel() { Command1 = ReactiveCommand.CreateFromObservable(val => Observable.Return(val)); Command2 = ReactiveCommand.CreateFromObservable(val => Observable.Return(val)); + Command3 = ReactiveCommand.CreateFromObservable(val => Observable.Return(val)); } } @@ -603,7 +606,7 @@ public void OFPNamedPropertyTestRepeats() public class WhenAnyObservableTests { [Fact] - public async Task WhenAnyObservableSmokeTest() + public async Task WhenAnyObservableSmokeTestMerging() { var fixture = new TestWhenAnyObsViewModel(); @@ -628,7 +631,33 @@ public async Task WhenAnyObservableSmokeTest() } [Fact] - public void WhenAnyWithNullObjectShouldUpdateWhenObjectIsntNullAnymore() + public async Task WhenAnyObservableSmokeTestCombining() + { + var fixture = new TestWhenAnyObsViewModel(); + + var list = new List(); + fixture.WhenAnyObservable(x => x.Command3, x => x.Command1, (s, i) => s + " : " + i) + .Subscribe(list.Add); + + Assert.Equal(0, list.Count); + + await fixture.Command1.Execute(1); + await fixture.Command3.Execute("foo"); + Assert.Equal(1, list.Count); + + await fixture.Command1.Execute(2); + Assert.Equal(2, list.Count); + + await fixture.Command3.Execute("bar"); + Assert.Equal(3, list.Count); + + Assert.True( + new[] { "foo : 1", "foo : 2", "bar : 2", }.Zip(list, (expected, actual) => new { expected, actual }) + .All(x => x.expected == x.actual)); + } + + [Fact] + public void WhenAnyObservableWithNullObjectShouldUpdateWhenObjectIsntNullAnymore() { var fixture = new TestWhenAnyObsViewModel(); var output = fixture.WhenAnyObservable(x => x.MyListOfInts.CountChanged).CreateCollection(); @@ -651,6 +680,7 @@ public void NullObservablesDoNotCauseExceptions() var fixture = new TestWhenAnyObsViewModel(); fixture.Command1 = null; + // these are the overloads of WhenAnyObservable that perform a Merge fixture.WhenAnyObservable(x => x.Command1).Subscribe(); fixture.WhenAnyObservable(x => x.Command1, x => x.Command1).Subscribe(); fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1).Subscribe(); @@ -662,6 +692,18 @@ public void NullObservablesDoNotCauseExceptions() fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1).Subscribe(); fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1).Subscribe(); fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1).Subscribe(); + + // these are the overloads of WhenAnyObservable that perform a CombineLatest + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, (_0, _1) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5, _6) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5, _6, _7) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => Unit.Default).Subscribe(); + fixture.WhenAnyObservable(x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, x => x.Command1, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => Unit.Default).Subscribe(); } } diff --git a/src/ReactiveUI/VariadicTemplates.cs b/src/ReactiveUI/VariadicTemplates.cs index 21490e2db6..3be06f8c76 100644 --- a/src/ReactiveUI/VariadicTemplates.cs +++ b/src/ReactiveUI/VariadicTemplates.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reactive.Disposables; using System.Reactive.Linq; @@ -11,7 +11,7 @@ namespace ReactiveUI { - public static class WhenAnyMixin + public static class WhenAnyMixin { /// /// WhenAnyValue allows you to observe whenever the value of a @@ -20,7 +20,7 @@ public static class WhenAnyMixin /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, + public static IObservable WhenAnyValue(this TSender This, Expression> property1) { return This.WhenAny(property1, (IObservedChange c1) => c1.Value); @@ -35,8 +35,8 @@ public static IObservable WhenAnyValue(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, Func selector) { return This.WhenAny(property1, @@ -51,14 +51,14 @@ public static IObservable WhenAnyValue(this TSender Thi /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, + public static IObservable WhenAny(this TSender This, + Expression> property1, Func, TRet> selector) { - return This.ObservableForProperty(property1, false, false).Select(selector); + return This.ObservableForProperty(property1, false, false).Select(selector); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -66,12 +66,12 @@ public static IObservable WhenAny(this TSender This, /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, Func, TRet> selector) { return ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false).Select(selector); + .SubscribeToExpressionChain(This, property1, false, false).Select(selector); } /// @@ -81,7 +81,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2 ) @@ -98,9 +98,9 @@ Expression> property2 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, Func selector) { return This.WhenAny(property1, property2, @@ -115,19 +115,19 @@ public static IObservable WhenAnyValue(this TSender /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, Func, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -135,16 +135,16 @@ public static IObservable WhenAny(this TSender This, /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, Func, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), selector ); } @@ -156,7 +156,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2, Expression> property3 @@ -174,10 +174,10 @@ Expression> property3 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, Func selector) { return This.WhenAny(property1, property2, property3, @@ -192,21 +192,21 @@ public static IObservable WhenAnyValue(this TSend /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, Func, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -214,19 +214,19 @@ public static IObservable WhenAny(this TSender Th /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, Func, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), selector ); } @@ -238,7 +238,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2, Expression> property3, @@ -257,11 +257,11 @@ Expression> property4 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, Func selector) { return This.WhenAny(property1, property2, property3, property4, @@ -276,23 +276,23 @@ public static IObservable WhenAnyValue(this TS /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, Func, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -300,22 +300,22 @@ public static IObservable WhenAny(this TSender /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, Func, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), selector ); } @@ -327,7 +327,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2, Expression> property3, @@ -347,12 +347,12 @@ Expression> property5 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, @@ -367,25 +367,25 @@ public static IObservable WhenAnyValue(this /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -393,25 +393,25 @@ public static IObservable WhenAny(this TSen /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), selector ); } @@ -423,7 +423,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2, Expression> property3, @@ -444,13 +444,13 @@ Expression> property6 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, @@ -465,27 +465,27 @@ public static IObservable WhenAnyValue(t /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -493,28 +493,28 @@ public static IObservable WhenAny(this T /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), selector ); } @@ -526,7 +526,7 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable> WhenAnyValue(this TSender This, + public static IObservable> WhenAnyValue(this TSender This, Expression> property1, Expression> property2, Expression> property3, @@ -548,14 +548,14 @@ Expression> property7 /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, @@ -570,29 +570,29 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -600,31 +600,31 @@ public static IObservable WhenAny(thi /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), selector ); } @@ -637,15 +637,15 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, property8, @@ -660,31 +660,31 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), - This.ObservableForProperty(property8, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property8, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -692,34 +692,34 @@ public static IObservable WhenAny( /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, - Expression property8, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, + Expression property8, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property8, false, false), + .SubscribeToExpressionChain(This, property8, false, false), selector ); } @@ -732,16 +732,16 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, property8, property9, @@ -756,33 +756,33 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), - This.ObservableForProperty(property8, false, false), - This.ObservableForProperty(property9, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property8, false, false), + This.ObservableForProperty(property9, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -790,37 +790,37 @@ public static IObservable WhenAny - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, - Expression property8, - Expression property9, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, + Expression property8, + Expression property9, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property8, false, false), + .SubscribeToExpressionChain(This, property8, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property9, false, false), + .SubscribeToExpressionChain(This, property9, false, false), selector ); } @@ -833,17 +833,17 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, property8, property9, property10, @@ -858,35 +858,35 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), - This.ObservableForProperty(property8, false, false), - This.ObservableForProperty(property9, false, false), - This.ObservableForProperty(property10, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property8, false, false), + This.ObservableForProperty(property9, false, false), + This.ObservableForProperty(property10, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -894,40 +894,40 @@ public static IObservable WhenAny - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, - Expression property8, - Expression property9, - Expression property10, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, + Expression property8, + Expression property9, + Expression property10, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property8, false, false), + .SubscribeToExpressionChain(This, property8, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property9, false, false), + .SubscribeToExpressionChain(This, property9, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property10, false, false), + .SubscribeToExpressionChain(This, property10, false, false), selector ); } @@ -940,18 +940,18 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, - Expression> property11, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, + Expression> property11, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, property8, property9, property10, property11, @@ -966,37 +966,37 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, - Expression> property11, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, + Expression> property11, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), - This.ObservableForProperty(property8, false, false), - This.ObservableForProperty(property9, false, false), - This.ObservableForProperty(property10, false, false), - This.ObservableForProperty(property11, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property8, false, false), + This.ObservableForProperty(property9, false, false), + This.ObservableForProperty(property10, false, false), + This.ObservableForProperty(property11, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -1004,43 +1004,43 @@ public static IObservable WhenAny - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, - Expression property8, - Expression property9, - Expression property10, - Expression property11, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, + Expression property8, + Expression property9, + Expression property10, + Expression property11, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property8, false, false), + .SubscribeToExpressionChain(This, property8, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property9, false, false), + .SubscribeToExpressionChain(This, property9, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property10, false, false), + .SubscribeToExpressionChain(This, property10, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property11, false, false), + .SubscribeToExpressionChain(This, property11, false, false), selector ); } @@ -1053,19 +1053,19 @@ public static IObservable WhenAnyDynamic(this TSender This, /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, - Expression> property11, - Expression> property12, + public static IObservable WhenAnyValue(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, + Expression> property11, + Expression> property12, Func selector) { return This.WhenAny(property1, property2, property3, property4, property5, property6, property7, property8, property9, property10, property11, property12, @@ -1080,39 +1080,39 @@ public static IObservable WhenAnyValue - public static IObservable WhenAny(this TSender This, - Expression> property1, - Expression> property2, - Expression> property3, - Expression> property4, - Expression> property5, - Expression> property6, - Expression> property7, - Expression> property8, - Expression> property9, - Expression> property10, - Expression> property11, - Expression> property12, + public static IObservable WhenAny(this TSender This, + Expression> property1, + Expression> property2, + Expression> property3, + Expression> property4, + Expression> property5, + Expression> property6, + Expression> property7, + Expression> property8, + Expression> property9, + Expression> property10, + Expression> property11, + Expression> property12, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( - This.ObservableForProperty(property1, false, false), - This.ObservableForProperty(property2, false, false), - This.ObservableForProperty(property3, false, false), - This.ObservableForProperty(property4, false, false), - This.ObservableForProperty(property5, false, false), - This.ObservableForProperty(property6, false, false), - This.ObservableForProperty(property7, false, false), - This.ObservableForProperty(property8, false, false), - This.ObservableForProperty(property9, false, false), - This.ObservableForProperty(property10, false, false), - This.ObservableForProperty(property11, false, false), - This.ObservableForProperty(property12, false, false), + This.ObservableForProperty(property1, false, false), + This.ObservableForProperty(property2, false, false), + This.ObservableForProperty(property3, false, false), + This.ObservableForProperty(property4, false, false), + This.ObservableForProperty(property5, false, false), + This.ObservableForProperty(property6, false, false), + This.ObservableForProperty(property7, false, false), + This.ObservableForProperty(property8, false, false), + This.ObservableForProperty(property9, false, false), + This.ObservableForProperty(property10, false, false), + This.ObservableForProperty(property11, false, false), + This.ObservableForProperty(property12, false, false), selector ); } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -1120,46 +1120,46 @@ public static IObservable WhenAny - public static IObservable WhenAnyDynamic(this TSender This, - Expression property1, - Expression property2, - Expression property3, - Expression property4, - Expression property5, - Expression property6, - Expression property7, - Expression property8, - Expression property9, - Expression property10, - Expression property11, - Expression property12, + public static IObservable WhenAnyDynamic(this TSender This, + Expression property1, + Expression property2, + Expression property3, + Expression property4, + Expression property5, + Expression property6, + Expression property7, + Expression property8, + Expression property9, + Expression property10, + Expression property11, + Expression property12, Func, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, IObservedChange, TRet> selector) { return Observable.CombineLatest( ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property1, false, false), + .SubscribeToExpressionChain(This, property1, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property2, false, false), + .SubscribeToExpressionChain(This, property2, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property3, false, false), + .SubscribeToExpressionChain(This, property3, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property4, false, false), + .SubscribeToExpressionChain(This, property4, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property5, false, false), + .SubscribeToExpressionChain(This, property5, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property6, false, false), + .SubscribeToExpressionChain(This, property6, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property7, false, false), + .SubscribeToExpressionChain(This, property7, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property8, false, false), + .SubscribeToExpressionChain(This, property8, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property9, false, false), + .SubscribeToExpressionChain(This, property9, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property10, false, false), + .SubscribeToExpressionChain(This, property10, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property11, false, false), + .SubscribeToExpressionChain(This, property11, false, false), ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property12, false, false), + .SubscribeToExpressionChain(This, property12, false, false), selector ); } @@ -1174,60 +1174,204 @@ public static IObservable WhenAnyObservable(this TSender Th public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2) { - return This.WhenAny(obs1, obs2, (o1, o2) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, (o1, o2) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3) { - return This.WhenAny(obs1, obs2, obs3, (o1, o2, o3) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, (o1, o2, o3) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4) { - return This.WhenAny(obs1, obs2, obs3, obs4, (o1, o2, o3, o4) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, (o1, o2, o3, o4) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, (o1, o2, o3, o4, o5) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, (o1, o2, o3, o4, o5) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, (o1, o2, o3, o4, o5, o6) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, (o1, o2, o3, o4, o5, o6) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, (o1, o2, o3, o4, o5, o6, o7) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, (o1, o2, o3, o4, o5, o6, o7) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7, Expression>> obs8) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, (o1, o2, o3, o4, o5, o6, o7, o8) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, (o1, o2, o3, o4, o5, o6, o7, o8) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7, Expression>> obs8, Expression>> obs9) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, (o1, o2, o3, o4, o5, o6, o7, o8, o9) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, (o1, o2, o3, o4, o5, o6, o7, o8, o9) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7, Expression>> obs8, Expression>> obs9, Expression>> obs10) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7, Expression>> obs8, Expression>> obs9, Expression>> obs10, Expression>> obs11) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } public static IObservable WhenAnyObservable(this TSender This, Expression>> obs1, Expression>> obs2, Expression>> obs3, Expression>> obs4, Expression>> obs5, Expression>> obs6, Expression>> obs7, Expression>> obs8, Expression>> obs9, Expression>> obs10, Expression>> obs11, Expression>> obs12) { - return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, obs12, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull(), o12.Value.EmptyIfNull() }) + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, obs12, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12) => new[] {o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull(), o12.Value.EmptyIfNull()}) .Select(x => x.Merge()).Switch(); } - } + + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Func selector) + { + return This.WhenAny(obs1, obs2, (o1, o2) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, (o1, o2, o3) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, (o1, o2, o3, o4) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, (o1, o2, o3, o4, o5) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, (o1, o2, o3, o4, o5, o6) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, (o1, o2, o3, o4, o5, o6, o7) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Expression>> obs8, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, (o1, o2, o3, o4, o5, o6, o7, o8) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Expression>> obs8, + Expression>> obs9, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, (o1, o2, o3, o4, o5, o6, o7, o8, o9) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Expression>> obs8, + Expression>> obs9, + Expression>> obs10, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Expression>> obs8, + Expression>> obs9, + Expression>> obs10, + Expression>> obs11, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull(), selector)) + .Switch(); + } + public static IObservable WhenAnyObservable(this TSender This, + Expression>> obs1, + Expression>> obs2, + Expression>> obs3, + Expression>> obs4, + Expression>> obs5, + Expression>> obs6, + Expression>> obs7, + Expression>> obs8, + Expression>> obs9, + Expression>> obs10, + Expression>> obs11, + Expression>> obs12, + Func selector) + { + return This.WhenAny(obs1, obs2, obs3, obs4, obs5, obs6, obs7, obs8, obs9, obs10, obs11, obs12, (o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12) => Observable.CombineLatest(o1.Value.EmptyIfNull(), o2.Value.EmptyIfNull(), o3.Value.EmptyIfNull(), o4.Value.EmptyIfNull(), o5.Value.EmptyIfNull(), o6.Value.EmptyIfNull(), o7.Value.EmptyIfNull(), o8.Value.EmptyIfNull(), o9.Value.EmptyIfNull(), o10.Value.EmptyIfNull(), o11.Value.EmptyIfNull(), o12.Value.EmptyIfNull(), selector)) + .Switch(); + } +} internal static class ObservableExtensions { diff --git a/src/ReactiveUI/VariadicTemplates.tt b/src/ReactiveUI/VariadicTemplates.tt index 8410066195..14fec20155 100644 --- a/src/ReactiveUI/VariadicTemplates.tt +++ b/src/ReactiveUI/VariadicTemplates.tt @@ -22,7 +22,7 @@ int maxFuncLength = 12; namespace ReactiveUI { - public static class WhenAnyMixin + public static class WhenAnyMixin { /// /// WhenAnyValue allows you to observe whenever the value of a @@ -31,7 +31,7 @@ namespace ReactiveUI /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue(this TSender This, + public static IObservable WhenAnyValue(this TSender This, Expression> property1) { return This.WhenAny(property1, (IObservedChange c1) => c1.Value); @@ -54,7 +54,7 @@ namespace ReactiveUI /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable>> WhenAnyValue>(this TSender This, + public static IObservable>> WhenAnyValue>(this TSender This, <# for(int i=1; i <= length; i++) { #> Expression>> property<#=i#><# if (i != length) { #>,<# } #> @@ -73,9 +73,9 @@ namespace ReactiveUI /// method in constructors to set up bindings between properties that also /// need an initial setup. /// - public static IObservable WhenAnyValue>(this TSender This, + public static IObservable WhenAnyValue>(this TSender This, <# for(int i=1; i <= length; i++) { #> - Expression>> property<#=i#>, + Expression>> property<#=i#>, <# } #> Func<<#= String.Join(",", templParams) #>, TRet> selector) { @@ -91,25 +91,25 @@ namespace ReactiveUI /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAny>(this TSender This, + public static IObservable WhenAny>(this TSender This, <# for(int i=1; i <= length; i++) { #> - Expression>> property<#=i#>, + Expression>> property<#=i#>, <# } #> Func<<#= selectorTypeParams #>, TRet> selector) { <# if (length == 1){ #> - return This.ObservableForProperty(property<#=1#>, false, false).Select(selector); + return This.ObservableForProperty(property<#=1#>, false, false).Select(selector); <# }else{ #> return Observable.CombineLatest( <# for(int i=1; i <= length; i++) { #> - This.ObservableForProperty(property<#=i#>, false, false), + This.ObservableForProperty(property<#=i#>, false, false), <# } #> selector ); <# } #> } - + /// /// WhenAny allows you to observe whenever one or more properties on an /// object have changed, providing an initial value when the Observable @@ -117,20 +117,20 @@ namespace ReactiveUI /// constructors to set up bindings between properties that also need an /// initial setup. /// - public static IObservable WhenAnyDynamic(this TSender This, + public static IObservable WhenAnyDynamic(this TSender This, <# for(int i=1; i <= length; i++) { #> - Expression property<#=i#>, + Expression property<#=i#>, <# } #> Func<<#= dynamicSelectorTypeParams #>, TRet> selector) { <# if (length == 1){ #> return ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property<#=1#>, false, false).Select(selector); + .SubscribeToExpressionChain(This, property<#=1#>, false, false).Select(selector); <# }else{ #> return Observable.CombineLatest( <# for(int i=1; i <= length; i++) { #> ReactiveNotifyPropertyChangedMixin - .SubscribeToExpressionChain(This, property<#=i#>, false, false), + .SubscribeToExpressionChain(This, property<#=i#>, false, false), <# } #> selector ); @@ -156,7 +156,23 @@ namespace ReactiveUI .Select(x => x.Merge()).Switch(); } <# } #> - } + +<# for(int length=2; length <= maxFuncLength; length++) { #> +<# var templParams = Enumerable.Range(1, length).Select(x => "T" + x.ToString()); #> +<# string varsStr = String.Join(", ", Enumerable.Range(1, length).Select(x => "obs" + x.ToString())); #> +<# string valsStr = String.Join(", ", Enumerable.Range(1, length).Select(x => "o" + x.ToString() + ".Value.EmptyIfNull()")); #> +<# string selectorTypeParams = String.Join(", ", templParams); #> + public static IObservable WhenAnyObservable>(this TSender This, + <# for(int i=1; i <= length; i++) { #> + Expression>>> obs<#=i#>, + <# } #> + Func<<#= selectorTypeParams #>, TRet> selector) + { + return This.WhenAny(<#= varsStr #>, (<#=varsStr.Replace("obs", "o")#>) => Observable.CombineLatest(<#= valsStr #>, selector)) + .Switch(); + } +<# } #> +} internal static class ObservableExtensions {