Propriétés de dépendance, les valeurs de notification de changement et réglage du constructeur

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

Question

I ont une classe de 3 propriétés de dépendance A, B, C. Les valeurs de ces propriétés sont définies par le constructeur et chacun des temps des propriétés A, B ou C modifications, est appelée la méthode de recalculer (). Maintenant, lors de l'exécution du constructeur ces méthodes est appelé 3 fois, parce que les 3 propriétés A, B, C sont modifiées. Hoewever ce n'est pas nécessaire que la méthode recalcul () ne peut rien faire vraiment utile sans les 3 propriétés définies. Alors, quelle est la meilleure façon pour la notification de changement de propriété, mais cette notification contournent le changement dans le constructeur? Je pensais à ajouter la propriété notification changé dans le constructeur, mais chaque objet de la classe DPChangeSample serait toujours ajouter de plus en plus de notifications de changement. Merci pour tout soupçon!

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);
    }
}
Était-ce utile?

La solution

Pouvez-vous essayer?

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

Autres conseils

Utilisez DependencyObject.SetValueBase. Cela permet de contourner toutes les métadonnées spécifiées, de sorte que votre propertyChanged ne sera pas appelé. Voir msdn.

vous ne voulez pas exécuter recalcul () à moins que les trois propriétés sont définies, mais en elle est appelée à partir du constructeur lors de la mise a, b et c? Est-ce exact?

si oui, pouvez-vous pas mettre un chèque dans le recalcul près du sommet pour vérifier que les trois propriétés sont définies et décider si vous voulez exécuter ou non ....

Cela fonctionne parce que vous indique que

  

en tant que méthode de recalculer () ne peut pas faire   quoi que ce soit vraiment utile sans les 3   définir les propriétés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top