es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Este es el comportamiento esperado. Cuando se llama a ToPropertyEx dos veces en la misma propiedad SomeString con diferentes observables (WhenAnyValue), la segunda llamada sobrescribirá la primera. Esto se debe a que ToPropertyEx crea una nueva propiedad que está vinculada al primer IObservable, y luego la segunda llamada crea una nueva propiedad que está vinculada al segundo IObservable, reemplazando efectivamente al primero.

    Para lograr el comportamiento deseado de tener ambos disparadores WhenAnyValue actualizando la misma propiedad SomeString, puede combinar los observables WhenAnyValue utilizando el método Observable.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 utilizando Observable.CombineLatest, y luego se asignan a un nuevo formato utilizando una función lambda. Finalmente, el resultado está vinculado a la propiedad SomeString utilizando ToPropertyEx.

Comments are closed.