Pregunta

Estoy usando EventAggregator de Prism para una comunicación débilmente acoplada entre los ViewModels de mi módulo.Tengo varias propiedades (p. ej.Nombre, Apellido) en VerModeloA que necesitan actualizar propiedades en VerModeloB cuando sus valores cambian.Mi solución actual implica:

VerModeloA publica un evento con el nuevo valor de FirstName como carga útil:

 public string FirstName
    {
        get {return firstName;}
        set 
        {
            this.firstName = value;
            eventAggregator.GetEvent<PatientDetailsEvent>().Publish(firstName);
        }
    }

VerModeloB está suscrito al evento y cambia su propiedad FirstName en consecuencia:

public PatientBannerViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        eventAggregator.GetEvent<PatientDetailsEvent>().Subscribe(UpdateBanner, ThreadOption.UIThread);
    }

    public void UpdateBanner(string firstName)
    {
        this.FirstName = firstName;
    }

Esto funciona bien para una sola propiedad.No funciona para propiedades múltiples y diferentes porque VerModeloB no tiene idea de qué propiedad ha cambiado VerModeloA .ViewModelB sabe cuál es el nuevo valor, pero no sabe cuál de sus propiedades actualizar.

Podría crear eventos separados para cada propiedad, pero esto parece repetitivo.Parece más limpio usar solo un evento.Idealmente, al publicar el evento, ViewModelA debería indicarle a ViewModelB qué propiedad ha cambiado.¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Lo siento, encontré la respuesta a mi pregunta en esta publicación. Esta publicación de blog de Rachel Lim también es útil.

Lo que necesitamos es para VerModeloA (el editor) para decir VerModeloB (el suscriptor) dos datos:

  1. ¿Qué propiedad ha cambiado? VerModeloA
  2. ¿Cuál es el nuevo valor de esta propiedad?

Necesitamos comunicar 2 piezas de información (es decir.propiedades) pero el EventAggregator de Prism toma solo un parámetro, el payload.Este es el problema.

Para pasar múltiples piezas de información (propiedades) a través de EventAggregator puede publicar una instancia de una clase que define estas propiedades como EventAggregator payload.Llamé a esta clase PatientDetailsEventParameters y define dos propiedades:

public class PatientDetailsEventParameters
{
    public string PatientProperty { get; set; }
    public string Value { get; set; }
}

Creé esta clase en un ensamblaje de Infraestructura (el mismo lugar donde defino mis Eventos) al que todos mis demás ensamblajes tienen referencia.

Luego puede publicar una instancia de esta clase como carga útil (en lugar de una cadena que contiene solo 1 valor).Esto permite pasar múltiples parámetros a la carga útil.

public string FirstName
    {
        get 
        {
            return firstName;
        }
        set 
        {
            this.firstName = value;
            eventAggregator.GetEvent<PatientDetailsEvent>().Publish(new PatientDetailsEventParameters() {Value = firstName, PatientProperty = "firstName"});
        }
    }

Puedes ver aquí que una nueva instancia de mi PatientDetailsEventParameters se crea cuando el PatientDetailsEvent Esta publicado.las dos propiedades Value y PatientProperty también están establecidos. PatientProperty es una cadena que dice VerModeloB (es decir.el suscriptor) qué propiedad ha cambiado. Value es el nuevo valor de la propiedad que ha cambiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top