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.

¿Cómo se activa un evento dentro del setter de una propiedad?

Tengo una propiedad llamada “TrendPoint” de tipo ITrendPoint. Necesito invocar un evento “OnTrendPointChanged” cada vez que cambia el valor de TrendPoint y realizar un conjunto de operaciones. He intentado lo siguiente pero no puedo seguir adelante:

public class TestClass:ObservablePoint
{
   private ITrendPoint trendPoint;

   public ITrendPoint TrendPoint{
      get{ return trendPoint ;}
      set{ this.trendPoint= value;
      //Necesito invocar el manejador de eventos "OnTrendPointChanged"
      }
   }

   public void TestJob(){
      //Se establece TrendPoint aquí
      TrendPoint= Services.getTrendPoint();
   }

   //Manejador de eventos
   private void OnTrendPointChanged(object sender, ValueChangedEventArgs<string> e){
      switch(e.value){
         case "HIGH":
         Log("TR HIGH");
         case "Low":
         Log("TR LOW");
         //Otras condiciones similares
         .
         .
         .
      }
   }
}

No puedo averiguar cómo hacer que el manejador de eventos “OnTrendPointChanged” se ejecute cada vez que cambia el valor de “TrendPoint”. Se agradece cualquier ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para activar el evento “OnTrendPointChanged” cada vez que cambie el valor de “TrendPoint”, se debe subscribir al evento “PropertyChanged” de la clase base “ObservablePoint”. Aquí te mostramos cómo puedes modificar tu código para lograr esto:

    public class TestClass : ObservablePoint
    {
        private ITrendPoint trendPoint;
    
        public ITrendPoint TrendPoint
        {
            get { return trendPoint; }
            set
            {
                if (trendPoint != value)
                {
                    trendPoint = value;
                    OnPropertyChanged(nameof(TrendPoint));
                    OnTrendPointChanged();
                }
            }
        }
    
        public void TestJob()
        {
            // Aquí se establece el Valor de TrendPoint
            TrendPoint = Services.getTrendPoint();
        }
    
        private void OnTrendPointChanged()
        {
            switch (TrendPoint.Value)
            {
                case "HIGH":
                    Log("TR ALTO");
                    break;
                case "Low":
                    Log("TR BAJO");
                    break;
                // Otras condiciones similares
                // ...
                default:
                    break;
            }
        }
    }
    

    En el setter de la propiedad “TrendPoint”, primero verificamos si el nuevo valor es diferente al valor actual antes de establecerlo. Si es diferente, activamos el evento “PropertyChanged” de la clase base para notificar a los subscriptores que el valor ha cambiado. Luego llamamos al método “OnTrendPointChanged” para realizar el conjunto de operaciones que deseas hacer cada vez que cambie el valor de “TrendPoint”.

    Finalmente, también modificamos la firma y la implementación de “OnTrendPointChanged” para aprovechar el hecho de que ahora tenemos acceso directo al valor actual de “TrendPoint”. Usamos un switch en el valor de “TrendPoint.Value” y realizamos las operaciones apropiadas para cada posible valor. Ten en cuenta que se asume que “ITrendPoint” tiene una propiedad llamada “Value” que devuelve una cadena que representa el valor actual del punto de tendencia. Es posible que debas ajustar esto en función de la implementación real de “ITrendPoint”.

Comments are closed.