Pregunta

I tiene una clase con 3 propiedades de dependencia A, B, C. Los valores de estas propiedades se establecen por el constructor y cada vez que una de las propiedades A, B o C cambios, el volver a calcular de método () se llama. Ahora durante la ejecución del constructor estos método se llama 3 veces, ya que las 3 propiedades de A, B, C se cambian. Hoewever esto no es necesario ya que el método de volver a calcular () no puede hacer nada realmente útil sin los 3 propiedades establecidas. Entonces, ¿cuál es la mejor forma de notificación de cambio de propiedad, sino eludir esta notificación de cambio en el constructor? Pensé en la adición de la notificación cambiado la propiedad en el constructor, pero luego cada objeto de la clase DPChangeSample siempre añadiría más y más notificaciones de cambio. Gracias por cualquier sugerencia!

class DPChangeSample : DependencyObject
{                  
    public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));
    public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));
    public static DependencyProperty CProperty = DependencyProperty.Register("C", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));


    private static void propertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((DPChangeSample)d).recalculate();
    }


    private void recalculate()
    {
        // Using A, B, C do some cpu intensive calculations
    }


    public DPChangeSample(int a, int b, int c)
    {
        SetValue(AProperty, a);
        SetValue(BProperty, b);
        SetValue(CProperty, c);
    }
}
¿Fue útil?

Solución

Se puede probar esto?

private bool SupressCalculation = false;
private void recalculate() 
{ 
    if(SupressCalculation)
        return;
    // Using A, B, C do some cpu intensive caluclations 
} 


public DPChangeSample(int a, int b, int c) 
{
    SupressCalculation = true; 
    SetValue(AProperty, a); 
    SetValue(BProperty, b); 
    SupressCalculation = false;
    SetValue(CProperty, c); 
} 

Otros consejos

Uso DependencyObject.SetValueBase. Esto evita cualquier metadatos especificados, por lo que su PropertyChanged no será llamado. Ver MSDN .

usted no desea ejecutar volver a calcular () a menos que las tres propiedades se establecen, pero en el que es llamado desde el constructor cuando se configura a, b y c? ¿es esto correcto?

Si es así, puede que no sólo hay que poner un cheque en el volver a calcular en la parte superior para comprobar que las tres propiedades se establecen y decidir si desea ejecutar o no ....

Esto funciona porque se menciona que

  

como el volver a calcular de método () no puede hacer   nada realmente útil sin los 3   propiedades ajustar.

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