2017-03-02 1 views
0

Je travaille sur UserControl où j'ai les propriétés MaximumAngle et MinimumAngle.Deux propriétés de dépendance UserControl qui doivent être différentes

// MinimumAngle 

public double MinimumAngle 
{ 
    get { return (double)GetValue(MinimumAngleProperty); } 
    set { SetValue(MinimumAngleProperty, value); } 
} 
public static readonly DependencyProperty MinimumAngleProperty = DependencyProperty.Register(
    "MinimumAngle", typeof(double), typeof(RoundGauge), new PropertyMetadata((double)0, MinimumAnglePropertyChanged)); 

private static void MinimumAnglePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    RoundGauge rg = (RoundGauge)d; 
    rg.CreateTickLines(); 
} 

// MaximumAngle 

public double MaximumAngle 
{ 
    get { return (double)GetValue(MaximumAngleProperty); } 
    set { SetValue(MaximumAngleProperty, value); } 
} 
public static readonly DependencyProperty MaximumAngleProperty = DependencyProperty.Register(
    "MaximumAngle", typeof(double), typeof(RoundGauge), new PropertyMetadata((double)180, MaximumAnglePropertyChanged)); 

private static void MaximumAnglePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    RoundGauge rg = (RoundGauge)d; 
    rg.CreateTickLines(); 
} 

Ces propriétés doivent être différentes, parce que ma méthode CreateTickLines va fou quand il doit faire face à zéro.

Qu'est-ce que je peux faire avec ça?

+0

Enregistrez un [CoerceValueCallback] (https://msdn.microsoft.com/fr-fr/library/system.windows.coercevaluecallback (v = vs.110) .aspx) avec des métadonnées de propriété. – Clemens

+1

Vous pouvez probablement utiliser un 'ValidateValueCallback' comme décrit sur la page MSDN [Callbacks et validation des propriétés de dépendance] (https://msdn.microsoft.com/en-us/library/ms745795 (v = vs.110) .aspx) – Rachel

Répondre

2

En général, il existe deux approches possibles pour résoudre ce problème.

Approche I

Utiliser mécanisme de coercition pour modifier les valeurs afin qu'ils ne sont jamais égaux. Vous pouvez enregistrer un CoerceValueCallback via les métadonnées de propriété. Dans la méthode de rappel, vous pouvez modifier la valeur, par exemple, l'ajout/soustraction double.Epsilon:

private static void CoerceMinimumAngle(DependencyObject d, object baseValue) 
{ 
    if(d.GetValue(MaximumAngleProperty).Equals(baseValue)) 
     return (double)baseValue + double.Epsilon; 
    else 
     return baseValue; 
} 

rappel pour Coercion MaximumAngle serait symétrique.

Approche II

cette poignée de cas particulier dans votre méthode CreateTickLines. Selon le but et les détails de mise en œuvre de votre contrôle, vous pouvez y parvenir de plusieurs façons. Voici ce plusieurs qui me viennent à l'esprit (en supposant que j'interprète votre code correctement):

  • Ne rien faire, par exemple ajouter un chèque au début de CreateTickLines méthode et revenir simplement si les deux propriétés sont égales
  • Effacer tous les existants cocher les lignes et n'en créer aucune
  • Créer une seule coche correspondant à la valeur
  • Plus généralement - n'exécuter que la partie du code qui ne «folle» et qui ne dépend pas de la partie du code cela fait "devenir fou"

Mon conseil personnel serait de prendre la deuxième approche, surtout si cette exigence existe non pas parce que cet état est invalide, mais plutôt parce que cela pose un problème pour vous.