¿Deberían las llamadas múltiples de .WhenAny(…).ToPropertyEx(…) sobrescribirse entre sí?
Tengo un objeto con dos WhenAnyValues:
this.WhenAnyValue(x => x.SomeInt)
.Select(x => "Bar" + x)
.ToPropertyEx(this, x => x.SomeString);
this.WhenAnyValue(x => x.SomeInt)
.Select(x => "Foo" + x)
.ToPropertyEx(this, x => x.SomeString);
Las pruebas con entradas de 1 a 4 muestran:
1
Foo0
Foo1
2
Foo2
3
Foo3
4
Foo4
Al intercambiar el orden de los métodos WhenAnyValue, de manera que Bar sea el último, solo se activan los Bars. Parece que el último WhenAnyValue sobrescribe al primero. ¿Es esto un error o un comportamiento deseado? En caso de ser un error, esto es a partir de la versión 16.3.10 de ReactiveUI.
Este problema también aparece si los elementos se filtran, por ejemplo, Foo solo funciona en valores pares y Bar en valores impares. Todavía solo obtendrá el último WhenAnyValue que se haya llamado.
El Foo0 se debe a la ejecución diferida y no está relacionado con este problema.
davy.ai
Este es el comportamiento esperado. Cuando se llama a
ToPropertyEx
dos veces en la misma propiedadSomeString
con diferentes observables (WhenAnyValue
), la segunda llamada sobrescribirá la primera. Esto se debe a queToPropertyEx
crea una nueva propiedad que está vinculada al primerIObservable
, y luego la segunda llamada crea una nueva propiedad que está vinculada al segundoIObservable
, reemplazando efectivamente al primero.Para lograr el comportamiento deseado de tener ambos disparadores
WhenAnyValue
actualizando la misma propiedadSomeString
, puede combinar los observablesWhenAnyValue
utilizando el métodoObservable.CombineLatest
, y luego asignar el resultado al formato deseado. Por ejemplo:““
Observable.CombineLatest(
this.WhenAnyValue(x => x.SomeInt),
this.WhenAnyValue(x => x.SomeOtherProperty),
(intVal, otherVal) => $”Foo{intVal} – Bar{otherVal}”)
.ToPropertyEx(this, x => x.SomeString);
“`
Aquí, ambos observables
WhenAnyValue
se combinan utilizandoObservable.CombineLatest
, y luego se asignan a un nuevo formato utilizando una función lambda. Finalmente, el resultado está vinculado a la propiedadSomeString
utilizandoToPropertyEx
.