Dipendenza delle proprietà, i valori di notifica e per modificare le impostazione nel costruttore

StackOverflow https://stackoverflow.com/questions/3028680

Domanda

Ho una classe con 3 proprietà di dipendenza A, B, C. I valori di queste proprietà sono impostate dal costruttore e ogni volta che una delle proprietà A, B o C modifiche, il metodo Ricalcola () viene chiamato. Ora durante l'esecuzione del costruttore questi metodo è chiamato 3 volte, perché le proprietà 3 A, B, C sono cambiati. Hoewever questo non è necessario in quanto il metodo Ricalcola () non può fare nulla di veramente utile senza tutte e 3 le proprietà impostate. Allora, qual è il modo migliore per notifica di modifica proprietà, ma eludere questa notifica cambiamento nel costruttore? Ho pensato di aggiungere la proprietà di notifica cambiato nel costruttore, ma poi ogni oggetto della classe DPChangeSample sarebbe sempre aggiungere sempre più notifiche di modifica. Grazie per qualsiasi suggerimento!

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);
    }
}
È stato utile?

Soluzione

Si può provare questo?

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); 
} 

Altri suggerimenti

Usa DependencyObject.SetValueBase. Questo evita eventuali metadati specificati, così il vostro PropertyChanged non sarà chiamato. Vedere MSDN .

non si vuole eseguire Rielabora () a meno che tutte e tre le proprietà sono impostate, ma nel esso viene chiamato dal costruttore quando si imposta una, B e C? è corretto?

Se è così, si può non solo mettere un segno di spunta nella ricalcolo vicino alla parte superiore per controllare che tutte e tre le proprietà sono impostate e decidere se si desidera eseguire o meno ....

Ciò funzionerà perché si afferma che

  

come metodo di ricalcolo () non si può fare   nulla di veramente utile, senza tutti 3   Imposta proprietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top