PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/ReactiveUI/VariadicTemplates.cs

https://github.com/bsiegel/ReactiveUI
C# | 1656 lines | 1401 code | 87 blank | 168 comment | 12 complexity | bb7b1dac87d1e5744450637a1c36616c MD5 | raw file
Possible License(s): Apache-2.0, CC-BY-SA-3.0, LGPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reactive.Disposables;
  4. using System.Reactive.Linq;
  5. using System.Diagnostics.Contracts;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Reflection;
  9. using System.Text;
  10. namespace ReactiveUI
  11. {
  12. public static class WhenAnyMixin
  13. {
  14. /// <summary>
  15. /// WhenAny allows you to observe whenever one or more properties on an
  16. /// object have changed, providing an initial value when the Observable
  17. /// is set up, unlike ObservableForProperty(). Use this method in
  18. /// constructors to set up bindings between properties that also need an
  19. /// initial setup.
  20. /// </summary>
  21. public static IObservable<TRet> WhenAny<TSender, TRet, T1>(this TSender This,
  22. Expression<Func<TSender, T1>> property1,
  23. Func<IObservedChange<TSender, T1>, TRet> selector)
  24. {
  25. bool allInputsWorked = true;
  26. var slot1 = new ObservedChange<TSender, T1>() {
  27. Sender = This,
  28. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  29. };
  30. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  31. IObservedChange<TSender, T1> islot1 = slot1;
  32. return Observable.Create<TRet>(subject => {
  33. if (allInputsWorked) subject.OnNext(selector(islot1));
  34. return Observable.Merge(
  35. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1))
  36. ).Subscribe(subject);
  37. });
  38. }
  39. /// <summary>
  40. /// WhenAny allows you to observe whenever one or more properties on an
  41. /// object have changed, providing an initial value when the Observable
  42. /// is set up, unlike ObservableForProperty(). Use this method in
  43. /// constructors to set up bindings between properties that also need an
  44. /// initial setup.
  45. /// </summary>
  46. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  47. string[] property1,
  48. Func<IObservedChange<TSender, object>, TRet> selector)
  49. {
  50. var slot1 = new ObservedChange<TSender, object>() {
  51. Sender = This,
  52. PropertyName = String.Join(".", property1),
  53. };
  54. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  55. IObservedChange<TSender, object> islot1 = slot1;
  56. return Observable.Create<TRet>(subject => {
  57. subject.OnNext(selector(islot1));
  58. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1)) ).Subscribe(subject);
  59. });
  60. }
  61. /// <summary>
  62. /// WhenAny allows you to observe whenever one or more properties on an
  63. /// object have changed, providing an initial value when the Observable
  64. /// is set up, unlike ObservableForProperty(). Use this method in
  65. /// constructors to set up bindings between properties that also need an
  66. /// initial setup.
  67. /// </summary>
  68. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2>(this TSender This,
  69. Expression<Func<TSender, T1>> property1,
  70. Expression<Func<TSender, T2>> property2,
  71. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, TRet> selector)
  72. {
  73. bool allInputsWorked = true;
  74. var slot1 = new ObservedChange<TSender, T1>() {
  75. Sender = This,
  76. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  77. };
  78. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  79. IObservedChange<TSender, T1> islot1 = slot1;
  80. var slot2 = new ObservedChange<TSender, T2>() {
  81. Sender = This,
  82. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  83. };
  84. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  85. IObservedChange<TSender, T2> islot2 = slot2;
  86. return Observable.Create<TRet>(subject => {
  87. if (allInputsWorked) subject.OnNext(selector(islot1, islot2));
  88. return Observable.Merge(
  89. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)),
  90. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2))
  91. ).Subscribe(subject);
  92. });
  93. }
  94. /// <summary>
  95. /// WhenAny allows you to observe whenever one or more properties on an
  96. /// object have changed, providing an initial value when the Observable
  97. /// is set up, unlike ObservableForProperty(). Use this method in
  98. /// constructors to set up bindings between properties that also need an
  99. /// initial setup.
  100. /// </summary>
  101. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  102. string[] property1,
  103. string[] property2,
  104. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  105. {
  106. var slot1 = new ObservedChange<TSender, object>() {
  107. Sender = This,
  108. PropertyName = String.Join(".", property1),
  109. };
  110. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  111. IObservedChange<TSender, object> islot1 = slot1;
  112. var slot2 = new ObservedChange<TSender, object>() {
  113. Sender = This,
  114. PropertyName = String.Join(".", property2),
  115. };
  116. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  117. IObservedChange<TSender, object> islot2 = slot2;
  118. return Observable.Create<TRet>(subject => {
  119. subject.OnNext(selector(islot1, islot2));
  120. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)) ).Subscribe(subject);
  121. });
  122. }
  123. /// <summary>
  124. /// WhenAny allows you to observe whenever one or more properties on an
  125. /// object have changed, providing an initial value when the Observable
  126. /// is set up, unlike ObservableForProperty(). Use this method in
  127. /// constructors to set up bindings between properties that also need an
  128. /// initial setup.
  129. /// </summary>
  130. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3>(this TSender This,
  131. Expression<Func<TSender, T1>> property1,
  132. Expression<Func<TSender, T2>> property2,
  133. Expression<Func<TSender, T3>> property3,
  134. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, TRet> selector)
  135. {
  136. bool allInputsWorked = true;
  137. var slot1 = new ObservedChange<TSender, T1>() {
  138. Sender = This,
  139. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  140. };
  141. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  142. IObservedChange<TSender, T1> islot1 = slot1;
  143. var slot2 = new ObservedChange<TSender, T2>() {
  144. Sender = This,
  145. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  146. };
  147. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  148. IObservedChange<TSender, T2> islot2 = slot2;
  149. var slot3 = new ObservedChange<TSender, T3>() {
  150. Sender = This,
  151. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  152. };
  153. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  154. IObservedChange<TSender, T3> islot3 = slot3;
  155. return Observable.Create<TRet>(subject => {
  156. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3));
  157. return Observable.Merge(
  158. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)),
  159. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)),
  160. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3))
  161. ).Subscribe(subject);
  162. });
  163. }
  164. /// <summary>
  165. /// WhenAny allows you to observe whenever one or more properties on an
  166. /// object have changed, providing an initial value when the Observable
  167. /// is set up, unlike ObservableForProperty(). Use this method in
  168. /// constructors to set up bindings between properties that also need an
  169. /// initial setup.
  170. /// </summary>
  171. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  172. string[] property1,
  173. string[] property2,
  174. string[] property3,
  175. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  176. {
  177. var slot1 = new ObservedChange<TSender, object>() {
  178. Sender = This,
  179. PropertyName = String.Join(".", property1),
  180. };
  181. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  182. IObservedChange<TSender, object> islot1 = slot1;
  183. var slot2 = new ObservedChange<TSender, object>() {
  184. Sender = This,
  185. PropertyName = String.Join(".", property2),
  186. };
  187. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  188. IObservedChange<TSender, object> islot2 = slot2;
  189. var slot3 = new ObservedChange<TSender, object>() {
  190. Sender = This,
  191. PropertyName = String.Join(".", property3),
  192. };
  193. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  194. IObservedChange<TSender, object> islot3 = slot3;
  195. return Observable.Create<TRet>(subject => {
  196. subject.OnNext(selector(islot1, islot2, islot3));
  197. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)) ).Subscribe(subject);
  198. });
  199. }
  200. /// <summary>
  201. /// WhenAny allows you to observe whenever one or more properties on an
  202. /// object have changed, providing an initial value when the Observable
  203. /// is set up, unlike ObservableForProperty(). Use this method in
  204. /// constructors to set up bindings between properties that also need an
  205. /// initial setup.
  206. /// </summary>
  207. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4>(this TSender This,
  208. Expression<Func<TSender, T1>> property1,
  209. Expression<Func<TSender, T2>> property2,
  210. Expression<Func<TSender, T3>> property3,
  211. Expression<Func<TSender, T4>> property4,
  212. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, TRet> selector)
  213. {
  214. bool allInputsWorked = true;
  215. var slot1 = new ObservedChange<TSender, T1>() {
  216. Sender = This,
  217. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  218. };
  219. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  220. IObservedChange<TSender, T1> islot1 = slot1;
  221. var slot2 = new ObservedChange<TSender, T2>() {
  222. Sender = This,
  223. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  224. };
  225. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  226. IObservedChange<TSender, T2> islot2 = slot2;
  227. var slot3 = new ObservedChange<TSender, T3>() {
  228. Sender = This,
  229. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  230. };
  231. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  232. IObservedChange<TSender, T3> islot3 = slot3;
  233. var slot4 = new ObservedChange<TSender, T4>() {
  234. Sender = This,
  235. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  236. };
  237. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  238. IObservedChange<TSender, T4> islot4 = slot4;
  239. return Observable.Create<TRet>(subject => {
  240. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4));
  241. return Observable.Merge(
  242. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  243. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  244. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  245. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4))
  246. ).Subscribe(subject);
  247. });
  248. }
  249. /// <summary>
  250. /// WhenAny allows you to observe whenever one or more properties on an
  251. /// object have changed, providing an initial value when the Observable
  252. /// is set up, unlike ObservableForProperty(). Use this method in
  253. /// constructors to set up bindings between properties that also need an
  254. /// initial setup.
  255. /// </summary>
  256. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  257. string[] property1,
  258. string[] property2,
  259. string[] property3,
  260. string[] property4,
  261. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  262. {
  263. var slot1 = new ObservedChange<TSender, object>() {
  264. Sender = This,
  265. PropertyName = String.Join(".", property1),
  266. };
  267. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  268. IObservedChange<TSender, object> islot1 = slot1;
  269. var slot2 = new ObservedChange<TSender, object>() {
  270. Sender = This,
  271. PropertyName = String.Join(".", property2),
  272. };
  273. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  274. IObservedChange<TSender, object> islot2 = slot2;
  275. var slot3 = new ObservedChange<TSender, object>() {
  276. Sender = This,
  277. PropertyName = String.Join(".", property3),
  278. };
  279. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  280. IObservedChange<TSender, object> islot3 = slot3;
  281. var slot4 = new ObservedChange<TSender, object>() {
  282. Sender = This,
  283. PropertyName = String.Join(".", property4),
  284. };
  285. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  286. IObservedChange<TSender, object> islot4 = slot4;
  287. return Observable.Create<TRet>(subject => {
  288. subject.OnNext(selector(islot1, islot2, islot3, islot4));
  289. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)) ).Subscribe(subject);
  290. });
  291. }
  292. /// <summary>
  293. /// WhenAny allows you to observe whenever one or more properties on an
  294. /// object have changed, providing an initial value when the Observable
  295. /// is set up, unlike ObservableForProperty(). Use this method in
  296. /// constructors to set up bindings between properties that also need an
  297. /// initial setup.
  298. /// </summary>
  299. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5>(this TSender This,
  300. Expression<Func<TSender, T1>> property1,
  301. Expression<Func<TSender, T2>> property2,
  302. Expression<Func<TSender, T3>> property3,
  303. Expression<Func<TSender, T4>> property4,
  304. Expression<Func<TSender, T5>> property5,
  305. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, TRet> selector)
  306. {
  307. bool allInputsWorked = true;
  308. var slot1 = new ObservedChange<TSender, T1>() {
  309. Sender = This,
  310. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  311. };
  312. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  313. IObservedChange<TSender, T1> islot1 = slot1;
  314. var slot2 = new ObservedChange<TSender, T2>() {
  315. Sender = This,
  316. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  317. };
  318. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  319. IObservedChange<TSender, T2> islot2 = slot2;
  320. var slot3 = new ObservedChange<TSender, T3>() {
  321. Sender = This,
  322. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  323. };
  324. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  325. IObservedChange<TSender, T3> islot3 = slot3;
  326. var slot4 = new ObservedChange<TSender, T4>() {
  327. Sender = This,
  328. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  329. };
  330. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  331. IObservedChange<TSender, T4> islot4 = slot4;
  332. var slot5 = new ObservedChange<TSender, T5>() {
  333. Sender = This,
  334. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  335. };
  336. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  337. IObservedChange<TSender, T5> islot5 = slot5;
  338. return Observable.Create<TRet>(subject => {
  339. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5));
  340. return Observable.Merge(
  341. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  342. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  343. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  344. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  345. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5))
  346. ).Subscribe(subject);
  347. });
  348. }
  349. /// <summary>
  350. /// WhenAny allows you to observe whenever one or more properties on an
  351. /// object have changed, providing an initial value when the Observable
  352. /// is set up, unlike ObservableForProperty(). Use this method in
  353. /// constructors to set up bindings between properties that also need an
  354. /// initial setup.
  355. /// </summary>
  356. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  357. string[] property1,
  358. string[] property2,
  359. string[] property3,
  360. string[] property4,
  361. string[] property5,
  362. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  363. {
  364. var slot1 = new ObservedChange<TSender, object>() {
  365. Sender = This,
  366. PropertyName = String.Join(".", property1),
  367. };
  368. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  369. IObservedChange<TSender, object> islot1 = slot1;
  370. var slot2 = new ObservedChange<TSender, object>() {
  371. Sender = This,
  372. PropertyName = String.Join(".", property2),
  373. };
  374. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  375. IObservedChange<TSender, object> islot2 = slot2;
  376. var slot3 = new ObservedChange<TSender, object>() {
  377. Sender = This,
  378. PropertyName = String.Join(".", property3),
  379. };
  380. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  381. IObservedChange<TSender, object> islot3 = slot3;
  382. var slot4 = new ObservedChange<TSender, object>() {
  383. Sender = This,
  384. PropertyName = String.Join(".", property4),
  385. };
  386. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  387. IObservedChange<TSender, object> islot4 = slot4;
  388. var slot5 = new ObservedChange<TSender, object>() {
  389. Sender = This,
  390. PropertyName = String.Join(".", property5),
  391. };
  392. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  393. IObservedChange<TSender, object> islot5 = slot5;
  394. return Observable.Create<TRet>(subject => {
  395. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5));
  396. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)) ).Subscribe(subject);
  397. });
  398. }
  399. /// <summary>
  400. /// WhenAny allows you to observe whenever one or more properties on an
  401. /// object have changed, providing an initial value when the Observable
  402. /// is set up, unlike ObservableForProperty(). Use this method in
  403. /// constructors to set up bindings between properties that also need an
  404. /// initial setup.
  405. /// </summary>
  406. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6>(this TSender This,
  407. Expression<Func<TSender, T1>> property1,
  408. Expression<Func<TSender, T2>> property2,
  409. Expression<Func<TSender, T3>> property3,
  410. Expression<Func<TSender, T4>> property4,
  411. Expression<Func<TSender, T5>> property5,
  412. Expression<Func<TSender, T6>> property6,
  413. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, TRet> selector)
  414. {
  415. bool allInputsWorked = true;
  416. var slot1 = new ObservedChange<TSender, T1>() {
  417. Sender = This,
  418. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  419. };
  420. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  421. IObservedChange<TSender, T1> islot1 = slot1;
  422. var slot2 = new ObservedChange<TSender, T2>() {
  423. Sender = This,
  424. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  425. };
  426. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  427. IObservedChange<TSender, T2> islot2 = slot2;
  428. var slot3 = new ObservedChange<TSender, T3>() {
  429. Sender = This,
  430. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  431. };
  432. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  433. IObservedChange<TSender, T3> islot3 = slot3;
  434. var slot4 = new ObservedChange<TSender, T4>() {
  435. Sender = This,
  436. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  437. };
  438. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  439. IObservedChange<TSender, T4> islot4 = slot4;
  440. var slot5 = new ObservedChange<TSender, T5>() {
  441. Sender = This,
  442. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  443. };
  444. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  445. IObservedChange<TSender, T5> islot5 = slot5;
  446. var slot6 = new ObservedChange<TSender, T6>() {
  447. Sender = This,
  448. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  449. };
  450. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  451. IObservedChange<TSender, T6> islot6 = slot6;
  452. return Observable.Create<TRet>(subject => {
  453. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6));
  454. return Observable.Merge(
  455. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  456. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  457. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  458. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  459. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  460. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6))
  461. ).Subscribe(subject);
  462. });
  463. }
  464. /// <summary>
  465. /// WhenAny allows you to observe whenever one or more properties on an
  466. /// object have changed, providing an initial value when the Observable
  467. /// is set up, unlike ObservableForProperty(). Use this method in
  468. /// constructors to set up bindings between properties that also need an
  469. /// initial setup.
  470. /// </summary>
  471. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  472. string[] property1,
  473. string[] property2,
  474. string[] property3,
  475. string[] property4,
  476. string[] property5,
  477. string[] property6,
  478. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  479. {
  480. var slot1 = new ObservedChange<TSender, object>() {
  481. Sender = This,
  482. PropertyName = String.Join(".", property1),
  483. };
  484. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  485. IObservedChange<TSender, object> islot1 = slot1;
  486. var slot2 = new ObservedChange<TSender, object>() {
  487. Sender = This,
  488. PropertyName = String.Join(".", property2),
  489. };
  490. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  491. IObservedChange<TSender, object> islot2 = slot2;
  492. var slot3 = new ObservedChange<TSender, object>() {
  493. Sender = This,
  494. PropertyName = String.Join(".", property3),
  495. };
  496. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  497. IObservedChange<TSender, object> islot3 = slot3;
  498. var slot4 = new ObservedChange<TSender, object>() {
  499. Sender = This,
  500. PropertyName = String.Join(".", property4),
  501. };
  502. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  503. IObservedChange<TSender, object> islot4 = slot4;
  504. var slot5 = new ObservedChange<TSender, object>() {
  505. Sender = This,
  506. PropertyName = String.Join(".", property5),
  507. };
  508. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  509. IObservedChange<TSender, object> islot5 = slot5;
  510. var slot6 = new ObservedChange<TSender, object>() {
  511. Sender = This,
  512. PropertyName = String.Join(".", property6),
  513. };
  514. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  515. IObservedChange<TSender, object> islot6 = slot6;
  516. return Observable.Create<TRet>(subject => {
  517. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6));
  518. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)) ).Subscribe(subject);
  519. });
  520. }
  521. /// <summary>
  522. /// WhenAny allows you to observe whenever one or more properties on an
  523. /// object have changed, providing an initial value when the Observable
  524. /// is set up, unlike ObservableForProperty(). Use this method in
  525. /// constructors to set up bindings between properties that also need an
  526. /// initial setup.
  527. /// </summary>
  528. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7>(this TSender This,
  529. Expression<Func<TSender, T1>> property1,
  530. Expression<Func<TSender, T2>> property2,
  531. Expression<Func<TSender, T3>> property3,
  532. Expression<Func<TSender, T4>> property4,
  533. Expression<Func<TSender, T5>> property5,
  534. Expression<Func<TSender, T6>> property6,
  535. Expression<Func<TSender, T7>> property7,
  536. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, TRet> selector)
  537. {
  538. bool allInputsWorked = true;
  539. var slot1 = new ObservedChange<TSender, T1>() {
  540. Sender = This,
  541. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  542. };
  543. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  544. IObservedChange<TSender, T1> islot1 = slot1;
  545. var slot2 = new ObservedChange<TSender, T2>() {
  546. Sender = This,
  547. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  548. };
  549. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  550. IObservedChange<TSender, T2> islot2 = slot2;
  551. var slot3 = new ObservedChange<TSender, T3>() {
  552. Sender = This,
  553. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  554. };
  555. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  556. IObservedChange<TSender, T3> islot3 = slot3;
  557. var slot4 = new ObservedChange<TSender, T4>() {
  558. Sender = This,
  559. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  560. };
  561. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  562. IObservedChange<TSender, T4> islot4 = slot4;
  563. var slot5 = new ObservedChange<TSender, T5>() {
  564. Sender = This,
  565. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  566. };
  567. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  568. IObservedChange<TSender, T5> islot5 = slot5;
  569. var slot6 = new ObservedChange<TSender, T6>() {
  570. Sender = This,
  571. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  572. };
  573. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  574. IObservedChange<TSender, T6> islot6 = slot6;
  575. var slot7 = new ObservedChange<TSender, T7>() {
  576. Sender = This,
  577. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  578. };
  579. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  580. IObservedChange<TSender, T7> islot7 = slot7;
  581. return Observable.Create<TRet>(subject => {
  582. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7));
  583. return Observable.Merge(
  584. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  585. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  586. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  587. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  588. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  589. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  590. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7))
  591. ).Subscribe(subject);
  592. });
  593. }
  594. /// <summary>
  595. /// WhenAny allows you to observe whenever one or more properties on an
  596. /// object have changed, providing an initial value when the Observable
  597. /// is set up, unlike ObservableForProperty(). Use this method in
  598. /// constructors to set up bindings between properties that also need an
  599. /// initial setup.
  600. /// </summary>
  601. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  602. string[] property1,
  603. string[] property2,
  604. string[] property3,
  605. string[] property4,
  606. string[] property5,
  607. string[] property6,
  608. string[] property7,
  609. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  610. {
  611. var slot1 = new ObservedChange<TSender, object>() {
  612. Sender = This,
  613. PropertyName = String.Join(".", property1),
  614. };
  615. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  616. IObservedChange<TSender, object> islot1 = slot1;
  617. var slot2 = new ObservedChange<TSender, object>() {
  618. Sender = This,
  619. PropertyName = String.Join(".", property2),
  620. };
  621. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  622. IObservedChange<TSender, object> islot2 = slot2;
  623. var slot3 = new ObservedChange<TSender, object>() {
  624. Sender = This,
  625. PropertyName = String.Join(".", property3),
  626. };
  627. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  628. IObservedChange<TSender, object> islot3 = slot3;
  629. var slot4 = new ObservedChange<TSender, object>() {
  630. Sender = This,
  631. PropertyName = String.Join(".", property4),
  632. };
  633. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  634. IObservedChange<TSender, object> islot4 = slot4;
  635. var slot5 = new ObservedChange<TSender, object>() {
  636. Sender = This,
  637. PropertyName = String.Join(".", property5),
  638. };
  639. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  640. IObservedChange<TSender, object> islot5 = slot5;
  641. var slot6 = new ObservedChange<TSender, object>() {
  642. Sender = This,
  643. PropertyName = String.Join(".", property6),
  644. };
  645. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  646. IObservedChange<TSender, object> islot6 = slot6;
  647. var slot7 = new ObservedChange<TSender, object>() {
  648. Sender = This,
  649. PropertyName = String.Join(".", property7),
  650. };
  651. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  652. IObservedChange<TSender, object> islot7 = slot7;
  653. return Observable.Create<TRet>(subject => {
  654. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7));
  655. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)) ).Subscribe(subject);
  656. });
  657. }
  658. /// <summary>
  659. /// WhenAny allows you to observe whenever one or more properties on an
  660. /// object have changed, providing an initial value when the Observable
  661. /// is set up, unlike ObservableForProperty(). Use this method in
  662. /// constructors to set up bindings between properties that also need an
  663. /// initial setup.
  664. /// </summary>
  665. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8>(this TSender This,
  666. Expression<Func<TSender, T1>> property1,
  667. Expression<Func<TSender, T2>> property2,
  668. Expression<Func<TSender, T3>> property3,
  669. Expression<Func<TSender, T4>> property4,
  670. Expression<Func<TSender, T5>> property5,
  671. Expression<Func<TSender, T6>> property6,
  672. Expression<Func<TSender, T7>> property7,
  673. Expression<Func<TSender, T8>> property8,
  674. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, TRet> selector)
  675. {
  676. bool allInputsWorked = true;
  677. var slot1 = new ObservedChange<TSender, T1>() {
  678. Sender = This,
  679. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  680. };
  681. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  682. IObservedChange<TSender, T1> islot1 = slot1;
  683. var slot2 = new ObservedChange<TSender, T2>() {
  684. Sender = This,
  685. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  686. };
  687. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  688. IObservedChange<TSender, T2> islot2 = slot2;
  689. var slot3 = new ObservedChange<TSender, T3>() {
  690. Sender = This,
  691. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  692. };
  693. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  694. IObservedChange<TSender, T3> islot3 = slot3;
  695. var slot4 = new ObservedChange<TSender, T4>() {
  696. Sender = This,
  697. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  698. };
  699. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  700. IObservedChange<TSender, T4> islot4 = slot4;
  701. var slot5 = new ObservedChange<TSender, T5>() {
  702. Sender = This,
  703. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  704. };
  705. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  706. IObservedChange<TSender, T5> islot5 = slot5;
  707. var slot6 = new ObservedChange<TSender, T6>() {
  708. Sender = This,
  709. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  710. };
  711. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  712. IObservedChange<TSender, T6> islot6 = slot6;
  713. var slot7 = new ObservedChange<TSender, T7>() {
  714. Sender = This,
  715. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  716. };
  717. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  718. IObservedChange<TSender, T7> islot7 = slot7;
  719. var slot8 = new ObservedChange<TSender, T8>() {
  720. Sender = This,
  721. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property8)),
  722. };
  723. T8 slot8Value = default(T8); allInputsWorked &= slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  724. IObservedChange<TSender, T8> islot8 = slot8;
  725. return Observable.Create<TRet>(subject => {
  726. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8));
  727. return Observable.Merge(
  728. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  729. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  730. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  731. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  732. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  733. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  734. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)),
  735. This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8))
  736. ).Subscribe(subject);
  737. });
  738. }
  739. /// <summary>
  740. /// WhenAny allows you to observe whenever one or more properties on an
  741. /// object have changed, providing an initial value when the Observable
  742. /// is set up, unlike ObservableForProperty(). Use this method in
  743. /// constructors to set up bindings between properties that also need an
  744. /// initial setup.
  745. /// </summary>
  746. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  747. string[] property1,
  748. string[] property2,
  749. string[] property3,
  750. string[] property4,
  751. string[] property5,
  752. string[] property6,
  753. string[] property7,
  754. string[] property8,
  755. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  756. {
  757. var slot1 = new ObservedChange<TSender, object>() {
  758. Sender = This,
  759. PropertyName = String.Join(".", property1),
  760. };
  761. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  762. IObservedChange<TSender, object> islot1 = slot1;
  763. var slot2 = new ObservedChange<TSender, object>() {
  764. Sender = This,
  765. PropertyName = String.Join(".", property2),
  766. };
  767. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  768. IObservedChange<TSender, object> islot2 = slot2;
  769. var slot3 = new ObservedChange<TSender, object>() {
  770. Sender = This,
  771. PropertyName = String.Join(".", property3),
  772. };
  773. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  774. IObservedChange<TSender, object> islot3 = slot3;
  775. var slot4 = new ObservedChange<TSender, object>() {
  776. Sender = This,
  777. PropertyName = String.Join(".", property4),
  778. };
  779. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  780. IObservedChange<TSender, object> islot4 = slot4;
  781. var slot5 = new ObservedChange<TSender, object>() {
  782. Sender = This,
  783. PropertyName = String.Join(".", property5),
  784. };
  785. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  786. IObservedChange<TSender, object> islot5 = slot5;
  787. var slot6 = new ObservedChange<TSender, object>() {
  788. Sender = This,
  789. PropertyName = String.Join(".", property6),
  790. };
  791. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  792. IObservedChange<TSender, object> islot6 = slot6;
  793. var slot7 = new ObservedChange<TSender, object>() {
  794. Sender = This,
  795. PropertyName = String.Join(".", property7),
  796. };
  797. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  798. IObservedChange<TSender, object> islot7 = slot7;
  799. var slot8 = new ObservedChange<TSender, object>() {
  800. Sender = This,
  801. PropertyName = String.Join(".", property8),
  802. };
  803. object slot8Value = default(object); slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  804. IObservedChange<TSender, object> islot8 = slot8;
  805. return Observable.Create<TRet>(subject => {
  806. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8));
  807. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)), This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8)) ).Subscribe(subject);
  808. });
  809. }
  810. /// <summary>
  811. /// WhenAny allows you to observe whenever one or more properties on an
  812. /// object have changed, providing an initial value when the Observable
  813. /// is set up, unlike ObservableForProperty(). Use this method in
  814. /// constructors to set up bindings between properties that also need an
  815. /// initial setup.
  816. /// </summary>
  817. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8,T9>(this TSender This,
  818. Expression<Func<TSender, T1>> property1,
  819. Expression<Func<TSender, T2>> property2,
  820. Expression<Func<TSender, T3>> property3,
  821. Expression<Func<TSender, T4>> property4,
  822. Expression<Func<TSender, T5>> property5,
  823. Expression<Func<TSender, T6>> property6,
  824. Expression<Func<TSender, T7>> property7,
  825. Expression<Func<TSender, T8>> property8,
  826. Expression<Func<TSender, T9>> property9,
  827. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, TRet> selector)
  828. {
  829. bool allInputsWorked = true;
  830. var slot1 = new ObservedChange<TSender, T1>() {
  831. Sender = This,
  832. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  833. };
  834. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  835. IObservedChange<TSender, T1> islot1 = slot1;
  836. var slot2 = new ObservedChange<TSender, T2>() {
  837. Sender = This,
  838. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  839. };
  840. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  841. IObservedChange<TSender, T2> islot2 = slot2;
  842. var slot3 = new ObservedChange<TSender, T3>() {
  843. Sender = This,
  844. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  845. };
  846. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  847. IObservedChange<TSender, T3> islot3 = slot3;
  848. var slot4 = new ObservedChange<TSender, T4>() {
  849. Sender = This,
  850. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  851. };
  852. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  853. IObservedChange<TSender, T4> islot4 = slot4;
  854. var slot5 = new ObservedChange<TSender, T5>() {
  855. Sender = This,
  856. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  857. };
  858. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  859. IObservedChange<TSender, T5> islot5 = slot5;
  860. var slot6 = new ObservedChange<TSender, T6>() {
  861. Sender = This,
  862. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  863. };
  864. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  865. IObservedChange<TSender, T6> islot6 = slot6;
  866. var slot7 = new ObservedChange<TSender, T7>() {
  867. Sender = This,
  868. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  869. };
  870. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  871. IObservedChange<TSender, T7> islot7 = slot7;
  872. var slot8 = new ObservedChange<TSender, T8>() {
  873. Sender = This,
  874. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property8)),
  875. };
  876. T8 slot8Value = default(T8); allInputsWorked &= slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  877. IObservedChange<TSender, T8> islot8 = slot8;
  878. var slot9 = new ObservedChange<TSender, T9>() {
  879. Sender = This,
  880. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property9)),
  881. };
  882. T9 slot9Value = default(T9); allInputsWorked &= slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  883. IObservedChange<TSender, T9> islot9 = slot9;
  884. return Observable.Create<TRet>(subject => {
  885. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9));
  886. return Observable.Merge(
  887. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  888. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  889. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  890. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  891. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  892. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  893. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  894. This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)),
  895. This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9))
  896. ).Subscribe(subject);
  897. });
  898. }
  899. /// <summary>
  900. /// WhenAny allows you to observe whenever one or more properties on an
  901. /// object have changed, providing an initial value when the Observable
  902. /// is set up, unlike ObservableForProperty(). Use this method in
  903. /// constructors to set up bindings between properties that also need an
  904. /// initial setup.
  905. /// </summary>
  906. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  907. string[] property1,
  908. string[] property2,
  909. string[] property3,
  910. string[] property4,
  911. string[] property5,
  912. string[] property6,
  913. string[] property7,
  914. string[] property8,
  915. string[] property9,
  916. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  917. {
  918. var slot1 = new ObservedChange<TSender, object>() {
  919. Sender = This,
  920. PropertyName = String.Join(".", property1),
  921. };
  922. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  923. IObservedChange<TSender, object> islot1 = slot1;
  924. var slot2 = new ObservedChange<TSender, object>() {
  925. Sender = This,
  926. PropertyName = String.Join(".", property2),
  927. };
  928. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  929. IObservedChange<TSender, object> islot2 = slot2;
  930. var slot3 = new ObservedChange<TSender, object>() {
  931. Sender = This,
  932. PropertyName = String.Join(".", property3),
  933. };
  934. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  935. IObservedChange<TSender, object> islot3 = slot3;
  936. var slot4 = new ObservedChange<TSender, object>() {
  937. Sender = This,
  938. PropertyName = String.Join(".", property4),
  939. };
  940. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  941. IObservedChange<TSender, object> islot4 = slot4;
  942. var slot5 = new ObservedChange<TSender, object>() {
  943. Sender = This,
  944. PropertyName = String.Join(".", property5),
  945. };
  946. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  947. IObservedChange<TSender, object> islot5 = slot5;
  948. var slot6 = new ObservedChange<TSender, object>() {
  949. Sender = This,
  950. PropertyName = String.Join(".", property6),
  951. };
  952. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  953. IObservedChange<TSender, object> islot6 = slot6;
  954. var slot7 = new ObservedChange<TSender, object>() {
  955. Sender = This,
  956. PropertyName = String.Join(".", property7),
  957. };
  958. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  959. IObservedChange<TSender, object> islot7 = slot7;
  960. var slot8 = new ObservedChange<TSender, object>() {
  961. Sender = This,
  962. PropertyName = String.Join(".", property8),
  963. };
  964. object slot8Value = default(object); slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  965. IObservedChange<TSender, object> islot8 = slot8;
  966. var slot9 = new ObservedChange<TSender, object>() {
  967. Sender = This,
  968. PropertyName = String.Join(".", property9),
  969. };
  970. object slot9Value = default(object); slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  971. IObservedChange<TSender, object> islot9 = slot9;
  972. return Observable.Create<TRet>(subject => {
  973. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9));
  974. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)), This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9)) ).Subscribe(subject);
  975. });
  976. }
  977. /// <summary>
  978. /// WhenAny allows you to observe whenever one or more properties on an
  979. /// object have changed, providing an initial value when the Observable
  980. /// is set up, unlike ObservableForProperty(). Use this method in
  981. /// constructors to set up bindings between properties that also need an
  982. /// initial setup.
  983. /// </summary>
  984. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>(this TSender This,
  985. Expression<Func<TSender, T1>> property1,
  986. Expression<Func<TSender, T2>> property2,
  987. Expression<Func<TSender, T3>> property3,
  988. Expression<Func<TSender, T4>> property4,
  989. Expression<Func<TSender, T5>> property5,
  990. Expression<Func<TSender, T6>> property6,
  991. Expression<Func<TSender, T7>> property7,
  992. Expression<Func<TSender, T8>> property8,
  993. Expression<Func<TSender, T9>> property9,
  994. Expression<Func<TSender, T10>> property10,
  995. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, IObservedChange<TSender, T10>, TRet> selector)
  996. {
  997. bool allInputsWorked = true;
  998. var slot1 = new ObservedChange<TSender, T1>() {
  999. Sender = This,
  1000. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  1001. };
  1002. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1003. IObservedChange<TSender, T1> islot1 = slot1;
  1004. var slot2 = new ObservedChange<TSender, T2>() {
  1005. Sender = This,
  1006. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  1007. };
  1008. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1009. IObservedChange<TSender, T2> islot2 = slot2;
  1010. var slot3 = new ObservedChange<TSender, T3>() {
  1011. Sender = This,
  1012. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  1013. };
  1014. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1015. IObservedChange<TSender, T3> islot3 = slot3;
  1016. var slot4 = new ObservedChange<TSender, T4>() {
  1017. Sender = This,
  1018. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  1019. };
  1020. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1021. IObservedChange<TSender, T4> islot4 = slot4;
  1022. var slot5 = new ObservedChange<TSender, T5>() {
  1023. Sender = This,
  1024. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  1025. };
  1026. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1027. IObservedChange<TSender, T5> islot5 = slot5;
  1028. var slot6 = new ObservedChange<TSender, T6>() {
  1029. Sender = This,
  1030. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  1031. };
  1032. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1033. IObservedChange<TSender, T6> islot6 = slot6;
  1034. var slot7 = new ObservedChange<TSender, T7>() {
  1035. Sender = This,
  1036. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  1037. };
  1038. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1039. IObservedChange<TSender, T7> islot7 = slot7;
  1040. var slot8 = new ObservedChange<TSender, T8>() {
  1041. Sender = This,
  1042. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property8)),
  1043. };
  1044. T8 slot8Value = default(T8); allInputsWorked &= slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1045. IObservedChange<TSender, T8> islot8 = slot8;
  1046. var slot9 = new ObservedChange<TSender, T9>() {
  1047. Sender = This,
  1048. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property9)),
  1049. };
  1050. T9 slot9Value = default(T9); allInputsWorked &= slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1051. IObservedChange<TSender, T9> islot9 = slot9;
  1052. var slot10 = new ObservedChange<TSender, T10>() {
  1053. Sender = This,
  1054. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property10)),
  1055. };
  1056. T10 slot10Value = default(T10); allInputsWorked &= slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1057. IObservedChange<TSender, T10> islot10 = slot10;
  1058. return Observable.Create<TRet>(subject => {
  1059. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10));
  1060. return Observable.Merge(
  1061. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1062. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1063. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1064. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1065. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1066. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1067. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1068. This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1069. This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)),
  1070. This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10))
  1071. ).Subscribe(subject);
  1072. });
  1073. }
  1074. /// <summary>
  1075. /// WhenAny allows you to observe whenever one or more properties on an
  1076. /// object have changed, providing an initial value when the Observable
  1077. /// is set up, unlike ObservableForProperty(). Use this method in
  1078. /// constructors to set up bindings between properties that also need an
  1079. /// initial setup.
  1080. /// </summary>
  1081. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  1082. string[] property1,
  1083. string[] property2,
  1084. string[] property3,
  1085. string[] property4,
  1086. string[] property5,
  1087. string[] property6,
  1088. string[] property7,
  1089. string[] property8,
  1090. string[] property9,
  1091. string[] property10,
  1092. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  1093. {
  1094. var slot1 = new ObservedChange<TSender, object>() {
  1095. Sender = This,
  1096. PropertyName = String.Join(".", property1),
  1097. };
  1098. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1099. IObservedChange<TSender, object> islot1 = slot1;
  1100. var slot2 = new ObservedChange<TSender, object>() {
  1101. Sender = This,
  1102. PropertyName = String.Join(".", property2),
  1103. };
  1104. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1105. IObservedChange<TSender, object> islot2 = slot2;
  1106. var slot3 = new ObservedChange<TSender, object>() {
  1107. Sender = This,
  1108. PropertyName = String.Join(".", property3),
  1109. };
  1110. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1111. IObservedChange<TSender, object> islot3 = slot3;
  1112. var slot4 = new ObservedChange<TSender, object>() {
  1113. Sender = This,
  1114. PropertyName = String.Join(".", property4),
  1115. };
  1116. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1117. IObservedChange<TSender, object> islot4 = slot4;
  1118. var slot5 = new ObservedChange<TSender, object>() {
  1119. Sender = This,
  1120. PropertyName = String.Join(".", property5),
  1121. };
  1122. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1123. IObservedChange<TSender, object> islot5 = slot5;
  1124. var slot6 = new ObservedChange<TSender, object>() {
  1125. Sender = This,
  1126. PropertyName = String.Join(".", property6),
  1127. };
  1128. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1129. IObservedChange<TSender, object> islot6 = slot6;
  1130. var slot7 = new ObservedChange<TSender, object>() {
  1131. Sender = This,
  1132. PropertyName = String.Join(".", property7),
  1133. };
  1134. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1135. IObservedChange<TSender, object> islot7 = slot7;
  1136. var slot8 = new ObservedChange<TSender, object>() {
  1137. Sender = This,
  1138. PropertyName = String.Join(".", property8),
  1139. };
  1140. object slot8Value = default(object); slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1141. IObservedChange<TSender, object> islot8 = slot8;
  1142. var slot9 = new ObservedChange<TSender, object>() {
  1143. Sender = This,
  1144. PropertyName = String.Join(".", property9),
  1145. };
  1146. object slot9Value = default(object); slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1147. IObservedChange<TSender, object> islot9 = slot9;
  1148. var slot10 = new ObservedChange<TSender, object>() {
  1149. Sender = This,
  1150. PropertyName = String.Join(".", property10),
  1151. };
  1152. object slot10Value = default(object); slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1153. IObservedChange<TSender, object> islot10 = slot10;
  1154. return Observable.Create<TRet>(subject => {
  1155. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10));
  1156. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)), This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10)) ).Subscribe(subject);
  1157. });
  1158. }
  1159. /// <summary>
  1160. /// WhenAny allows you to observe whenever one or more properties on an
  1161. /// object have changed, providing an initial value when the Observable
  1162. /// is set up, unlike ObservableForProperty(). Use this method in
  1163. /// constructors to set up bindings between properties that also need an
  1164. /// initial setup.
  1165. /// </summary>
  1166. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>(this TSender This,
  1167. Expression<Func<TSender, T1>> property1,
  1168. Expression<Func<TSender, T2>> property2,
  1169. Expression<Func<TSender, T3>> property3,
  1170. Expression<Func<TSender, T4>> property4,
  1171. Expression<Func<TSender, T5>> property5,
  1172. Expression<Func<TSender, T6>> property6,
  1173. Expression<Func<TSender, T7>> property7,
  1174. Expression<Func<TSender, T8>> property8,
  1175. Expression<Func<TSender, T9>> property9,
  1176. Expression<Func<TSender, T10>> property10,
  1177. Expression<Func<TSender, T11>> property11,
  1178. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, IObservedChange<TSender, T10>, IObservedChange<TSender, T11>, TRet> selector)
  1179. {
  1180. bool allInputsWorked = true;
  1181. var slot1 = new ObservedChange<TSender, T1>() {
  1182. Sender = This,
  1183. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  1184. };
  1185. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1186. IObservedChange<TSender, T1> islot1 = slot1;
  1187. var slot2 = new ObservedChange<TSender, T2>() {
  1188. Sender = This,
  1189. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  1190. };
  1191. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1192. IObservedChange<TSender, T2> islot2 = slot2;
  1193. var slot3 = new ObservedChange<TSender, T3>() {
  1194. Sender = This,
  1195. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  1196. };
  1197. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1198. IObservedChange<TSender, T3> islot3 = slot3;
  1199. var slot4 = new ObservedChange<TSender, T4>() {
  1200. Sender = This,
  1201. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  1202. };
  1203. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1204. IObservedChange<TSender, T4> islot4 = slot4;
  1205. var slot5 = new ObservedChange<TSender, T5>() {
  1206. Sender = This,
  1207. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  1208. };
  1209. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1210. IObservedChange<TSender, T5> islot5 = slot5;
  1211. var slot6 = new ObservedChange<TSender, T6>() {
  1212. Sender = This,
  1213. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  1214. };
  1215. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1216. IObservedChange<TSender, T6> islot6 = slot6;
  1217. var slot7 = new ObservedChange<TSender, T7>() {
  1218. Sender = This,
  1219. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  1220. };
  1221. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1222. IObservedChange<TSender, T7> islot7 = slot7;
  1223. var slot8 = new ObservedChange<TSender, T8>() {
  1224. Sender = This,
  1225. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property8)),
  1226. };
  1227. T8 slot8Value = default(T8); allInputsWorked &= slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1228. IObservedChange<TSender, T8> islot8 = slot8;
  1229. var slot9 = new ObservedChange<TSender, T9>() {
  1230. Sender = This,
  1231. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property9)),
  1232. };
  1233. T9 slot9Value = default(T9); allInputsWorked &= slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1234. IObservedChange<TSender, T9> islot9 = slot9;
  1235. var slot10 = new ObservedChange<TSender, T10>() {
  1236. Sender = This,
  1237. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property10)),
  1238. };
  1239. T10 slot10Value = default(T10); allInputsWorked &= slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1240. IObservedChange<TSender, T10> islot10 = slot10;
  1241. var slot11 = new ObservedChange<TSender, T11>() {
  1242. Sender = This,
  1243. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property11)),
  1244. };
  1245. T11 slot11Value = default(T11); allInputsWorked &= slot11.TryGetValue(out slot11Value); slot11.Value = slot11Value;
  1246. IObservedChange<TSender, T11> islot11 = slot11;
  1247. return Observable.Create<TRet>(subject => {
  1248. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11));
  1249. return Observable.Merge(
  1250. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1251. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1252. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1253. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1254. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1255. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1256. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1257. This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1258. This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1259. This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)),
  1260. This.ObservableForProperty(property11).Do(x => { lock (slot11) { islot11 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11))
  1261. ).Subscribe(subject);
  1262. });
  1263. }
  1264. /// <summary>
  1265. /// WhenAny allows you to observe whenever one or more properties on an
  1266. /// object have changed, providing an initial value when the Observable
  1267. /// is set up, unlike ObservableForProperty(). Use this method in
  1268. /// constructors to set up bindings between properties that also need an
  1269. /// initial setup.
  1270. /// </summary>
  1271. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  1272. string[] property1,
  1273. string[] property2,
  1274. string[] property3,
  1275. string[] property4,
  1276. string[] property5,
  1277. string[] property6,
  1278. string[] property7,
  1279. string[] property8,
  1280. string[] property9,
  1281. string[] property10,
  1282. string[] property11,
  1283. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  1284. {
  1285. var slot1 = new ObservedChange<TSender, object>() {
  1286. Sender = This,
  1287. PropertyName = String.Join(".", property1),
  1288. };
  1289. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1290. IObservedChange<TSender, object> islot1 = slot1;
  1291. var slot2 = new ObservedChange<TSender, object>() {
  1292. Sender = This,
  1293. PropertyName = String.Join(".", property2),
  1294. };
  1295. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1296. IObservedChange<TSender, object> islot2 = slot2;
  1297. var slot3 = new ObservedChange<TSender, object>() {
  1298. Sender = This,
  1299. PropertyName = String.Join(".", property3),
  1300. };
  1301. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1302. IObservedChange<TSender, object> islot3 = slot3;
  1303. var slot4 = new ObservedChange<TSender, object>() {
  1304. Sender = This,
  1305. PropertyName = String.Join(".", property4),
  1306. };
  1307. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1308. IObservedChange<TSender, object> islot4 = slot4;
  1309. var slot5 = new ObservedChange<TSender, object>() {
  1310. Sender = This,
  1311. PropertyName = String.Join(".", property5),
  1312. };
  1313. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1314. IObservedChange<TSender, object> islot5 = slot5;
  1315. var slot6 = new ObservedChange<TSender, object>() {
  1316. Sender = This,
  1317. PropertyName = String.Join(".", property6),
  1318. };
  1319. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1320. IObservedChange<TSender, object> islot6 = slot6;
  1321. var slot7 = new ObservedChange<TSender, object>() {
  1322. Sender = This,
  1323. PropertyName = String.Join(".", property7),
  1324. };
  1325. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1326. IObservedChange<TSender, object> islot7 = slot7;
  1327. var slot8 = new ObservedChange<TSender, object>() {
  1328. Sender = This,
  1329. PropertyName = String.Join(".", property8),
  1330. };
  1331. object slot8Value = default(object); slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1332. IObservedChange<TSender, object> islot8 = slot8;
  1333. var slot9 = new ObservedChange<TSender, object>() {
  1334. Sender = This,
  1335. PropertyName = String.Join(".", property9),
  1336. };
  1337. object slot9Value = default(object); slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1338. IObservedChange<TSender, object> islot9 = slot9;
  1339. var slot10 = new ObservedChange<TSender, object>() {
  1340. Sender = This,
  1341. PropertyName = String.Join(".", property10),
  1342. };
  1343. object slot10Value = default(object); slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1344. IObservedChange<TSender, object> islot10 = slot10;
  1345. var slot11 = new ObservedChange<TSender, object>() {
  1346. Sender = This,
  1347. PropertyName = String.Join(".", property11),
  1348. };
  1349. object slot11Value = default(object); slot11.TryGetValue(out slot11Value); slot11.Value = slot11Value;
  1350. IObservedChange<TSender, object> islot11 = slot11;
  1351. return Observable.Create<TRet>(subject => {
  1352. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11));
  1353. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)), This.ObservableForProperty(property11).Do(x => { lock (slot11) { islot11 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11)) ).Subscribe(subject);
  1354. });
  1355. }
  1356. /// <summary>
  1357. /// WhenAny allows you to observe whenever one or more properties on an
  1358. /// object have changed, providing an initial value when the Observable
  1359. /// is set up, unlike ObservableForProperty(). Use this method in
  1360. /// constructors to set up bindings between properties that also need an
  1361. /// initial setup.
  1362. /// </summary>
  1363. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>(this TSender This,
  1364. Expression<Func<TSender, T1>> property1,
  1365. Expression<Func<TSender, T2>> property2,
  1366. Expression<Func<TSender, T3>> property3,
  1367. Expression<Func<TSender, T4>> property4,
  1368. Expression<Func<TSender, T5>> property5,
  1369. Expression<Func<TSender, T6>> property6,
  1370. Expression<Func<TSender, T7>> property7,
  1371. Expression<Func<TSender, T8>> property8,
  1372. Expression<Func<TSender, T9>> property9,
  1373. Expression<Func<TSender, T10>> property10,
  1374. Expression<Func<TSender, T11>> property11,
  1375. Expression<Func<TSender, T12>> property12,
  1376. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, IObservedChange<TSender, T10>, IObservedChange<TSender, T11>, IObservedChange<TSender, T12>, TRet> selector)
  1377. {
  1378. bool allInputsWorked = true;
  1379. var slot1 = new ObservedChange<TSender, T1>() {
  1380. Sender = This,
  1381. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  1382. };
  1383. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1384. IObservedChange<TSender, T1> islot1 = slot1;
  1385. var slot2 = new ObservedChange<TSender, T2>() {
  1386. Sender = This,
  1387. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  1388. };
  1389. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1390. IObservedChange<TSender, T2> islot2 = slot2;
  1391. var slot3 = new ObservedChange<TSender, T3>() {
  1392. Sender = This,
  1393. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  1394. };
  1395. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1396. IObservedChange<TSender, T3> islot3 = slot3;
  1397. var slot4 = new ObservedChange<TSender, T4>() {
  1398. Sender = This,
  1399. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  1400. };
  1401. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1402. IObservedChange<TSender, T4> islot4 = slot4;
  1403. var slot5 = new ObservedChange<TSender, T5>() {
  1404. Sender = This,
  1405. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  1406. };
  1407. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1408. IObservedChange<TSender, T5> islot5 = slot5;
  1409. var slot6 = new ObservedChange<TSender, T6>() {
  1410. Sender = This,
  1411. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  1412. };
  1413. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1414. IObservedChange<TSender, T6> islot6 = slot6;
  1415. var slot7 = new ObservedChange<TSender, T7>() {
  1416. Sender = This,
  1417. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  1418. };
  1419. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1420. IObservedChange<TSender, T7> islot7 = slot7;
  1421. var slot8 = new ObservedChange<TSender, T8>() {
  1422. Sender = This,
  1423. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property8)),
  1424. };
  1425. T8 slot8Value = default(T8); allInputsWorked &= slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1426. IObservedChange<TSender, T8> islot8 = slot8;
  1427. var slot9 = new ObservedChange<TSender, T9>() {
  1428. Sender = This,
  1429. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property9)),
  1430. };
  1431. T9 slot9Value = default(T9); allInputsWorked &= slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1432. IObservedChange<TSender, T9> islot9 = slot9;
  1433. var slot10 = new ObservedChange<TSender, T10>() {
  1434. Sender = This,
  1435. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property10)),
  1436. };
  1437. T10 slot10Value = default(T10); allInputsWorked &= slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1438. IObservedChange<TSender, T10> islot10 = slot10;
  1439. var slot11 = new ObservedChange<TSender, T11>() {
  1440. Sender = This,
  1441. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property11)),
  1442. };
  1443. T11 slot11Value = default(T11); allInputsWorked &= slot11.TryGetValue(out slot11Value); slot11.Value = slot11Value;
  1444. IObservedChange<TSender, T11> islot11 = slot11;
  1445. var slot12 = new ObservedChange<TSender, T12>() {
  1446. Sender = This,
  1447. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property12)),
  1448. };
  1449. T12 slot12Value = default(T12); allInputsWorked &= slot12.TryGetValue(out slot12Value); slot12.Value = slot12Value;
  1450. IObservedChange<TSender, T12> islot12 = slot12;
  1451. return Observable.Create<TRet>(subject => {
  1452. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12));
  1453. return Observable.Merge(
  1454. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1455. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1456. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1457. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1458. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1459. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1460. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1461. This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1462. This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1463. This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1464. This.ObservableForProperty(property11).Do(x => { lock (slot11) { islot11 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)),
  1465. This.ObservableForProperty(property12).Do(x => { lock (slot12) { islot12 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12))
  1466. ).Subscribe(subject);
  1467. });
  1468. }
  1469. /// <summary>
  1470. /// WhenAny allows you to observe whenever one or more properties on an
  1471. /// object have changed, providing an initial value when the Observable
  1472. /// is set up, unlike ObservableForProperty(). Use this method in
  1473. /// constructors to set up bindings between properties that also need an
  1474. /// initial setup.
  1475. /// </summary>
  1476. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  1477. string[] property1,
  1478. string[] property2,
  1479. string[] property3,
  1480. string[] property4,
  1481. string[] property5,
  1482. string[] property6,
  1483. string[] property7,
  1484. string[] property8,
  1485. string[] property9,
  1486. string[] property10,
  1487. string[] property11,
  1488. string[] property12,
  1489. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  1490. {
  1491. var slot1 = new ObservedChange<TSender, object>() {
  1492. Sender = This,
  1493. PropertyName = String.Join(".", property1),
  1494. };
  1495. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  1496. IObservedChange<TSender, object> islot1 = slot1;
  1497. var slot2 = new ObservedChange<TSender, object>() {
  1498. Sender = This,
  1499. PropertyName = String.Join(".", property2),
  1500. };
  1501. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  1502. IObservedChange<TSender, object> islot2 = slot2;
  1503. var slot3 = new ObservedChange<TSender, object>() {
  1504. Sender = This,
  1505. PropertyName = String.Join(".", property3),
  1506. };
  1507. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  1508. IObservedChange<TSender, object> islot3 = slot3;
  1509. var slot4 = new ObservedChange<TSender, object>() {
  1510. Sender = This,
  1511. PropertyName = String.Join(".", property4),
  1512. };
  1513. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  1514. IObservedChange<TSender, object> islot4 = slot4;
  1515. var slot5 = new ObservedChange<TSender, object>() {
  1516. Sender = This,
  1517. PropertyName = String.Join(".", property5),
  1518. };
  1519. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  1520. IObservedChange<TSender, object> islot5 = slot5;
  1521. var slot6 = new ObservedChange<TSender, object>() {
  1522. Sender = This,
  1523. PropertyName = String.Join(".", property6),
  1524. };
  1525. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  1526. IObservedChange<TSender, object> islot6 = slot6;
  1527. var slot7 = new ObservedChange<TSender, object>() {
  1528. Sender = This,
  1529. PropertyName = String.Join(".", property7),
  1530. };
  1531. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  1532. IObservedChange<TSender, object> islot7 = slot7;
  1533. var slot8 = new ObservedChange<TSender, object>() {
  1534. Sender = This,
  1535. PropertyName = String.Join(".", property8),
  1536. };
  1537. object slot8Value = default(object); slot8.TryGetValue(out slot8Value); slot8.Value = slot8Value;
  1538. IObservedChange<TSender, object> islot8 = slot8;
  1539. var slot9 = new ObservedChange<TSender, object>() {
  1540. Sender = This,
  1541. PropertyName = String.Join(".", property9),
  1542. };
  1543. object slot9Value = default(object); slot9.TryGetValue(out slot9Value); slot9.Value = slot9Value;
  1544. IObservedChange<TSender, object> islot9 = slot9;
  1545. var slot10 = new ObservedChange<TSender, object>() {
  1546. Sender = This,
  1547. PropertyName = String.Join(".", property10),
  1548. };
  1549. object slot10Value = default(object); slot10.TryGetValue(out slot10Value); slot10.Value = slot10Value;
  1550. IObservedChange<TSender, object> islot10 = slot10;
  1551. var slot11 = new ObservedChange<TSender, object>() {
  1552. Sender = This,
  1553. PropertyName = String.Join(".", property11),
  1554. };
  1555. object slot11Value = default(object); slot11.TryGetValue(out slot11Value); slot11.Value = slot11Value;
  1556. IObservedChange<TSender, object> islot11 = slot11;
  1557. var slot12 = new ObservedChange<TSender, object>() {
  1558. Sender = This,
  1559. PropertyName = String.Join(".", property12),
  1560. };
  1561. object slot12Value = default(object); slot12.TryGetValue(out slot12Value); slot12.Value = slot12Value;
  1562. IObservedChange<TSender, object> islot12 = slot12;
  1563. return Observable.Create<TRet>(subject => {
  1564. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12));
  1565. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property8).Do(x => { lock (slot8) { islot8 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property9).Do(x => { lock (slot9) { islot9 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property10).Do(x => { lock (slot10) { islot10 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property11).Do(x => { lock (slot11) { islot11 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)), This.ObservableForProperty(property12).Do(x => { lock (slot12) { islot12 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7, islot8, islot9, islot10, islot11, islot12)) ).Subscribe(subject);
  1566. });
  1567. }
  1568. }
  1569. }