Pregunta

Estoy un poco confundido al crear una DependencyProperty para propiedades que dependen de fuentes externas. Por ejemplo, en una aplicación de ultrasonido que estoy escribiendo, actualmente tengo lo siguiente en un contenedor administrado de C ++ (traducido a C # para simplificar aquí, implementando INotifyPropertyChanged):

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        NotifyPropertyChanged("Gain");
    }
}

Todo mi código se usa en WPF, y estaba considerando cómo cambiar el INotifyPropertyChanged a DependencyProperty , y si me beneficiara de los cambios. Existen alrededor de 30 variables similares a esta, la mayoría de las cuales se enlazan a un control deslizante en pantalla, bloque de texto u otro control.

¿Sería correcto lo siguiente para implementar una DependencyProperty para este objeto?

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        this.SetValue(GainProperty, value); 
    }
}

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0));

Nunca he visto un ejemplo en el que this.GetValue (GainProperty) no se haya utilizado. Además, hay otras funciones que pueden cambiar el valor. ¿Sería este el cambio correcto también?

public void LoadSettingsFile(string fileName)
{
    // Load settings...

    // Gain will have changed after new settings are loaded.
    this.SetValue(GainProperty, this.Gain);
    // Used to be NotifyPropertyChanged("Gain");
}

Además, en una nota al margen, ¿debería esperar ganancias de rendimiento en los casos en que la mayoría de las propiedades están vinculadas a datos, o más bien, pérdida de rendimiento en los casos en que muchos parámetros NO están vinculados a datos?

¿Fue útil?

Solución

Cuando se usa una propiedad de dependencia, los métodos Get y Set deben ser simples envoltorios para this.GetValue () y this.SetValue (), la razón de esto es que WPF no usa los captadores o setters para acceder al valor. no puede depender del código adicional que se ejecuta todo el tiempo.

Si necesita que estas propiedades sean propiedades de dependencia, cree una propiedad de dependencia estándar que almacene en caché su resultado de ultrasonido.GetParam (prmGain) y llame a ultrasonido.SetParam (prmGain, valor) dentro del evento PropertyChanged que se llamará confiablemente no importa cómo se cambie la propiedad.


Si bien lo que he escrito anteriormente sigue siendo correcto, releer su pregunta me hace pensar que puede estar malinterpretando qué es una propiedad de dependencia. Si este objeto contenedor de C ++ es efectivamente su modelo, entonces desea permanecer con INotifyPropertyChanged. Las propiedades de dependencia están diseñadas para ser utilizadas internamente por un control WPF para facilitar el enlace y reducir la huella de memoria del control. Se supone que no deben usarse dentro del proveedor de datos, para eso están las interfaces de notificación.

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