2017-03-02 9 views
0

UserControl私はMaximumAngleMinimumAngleプロパティを持っています。2つのUserControl依存プロパティーが異なる必要があります

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

それがゼロに対処しなければならないときに私CreateTickLines方法が狂っているため、これらの特性は、異なっている必要があります。

私はこれで何ができますか?

+0

プロパティメタデータを持つ[CoerceValueCallback](https://msdn.microsoft.com/en-us/library/system.windows.coercevaluecallback(v = vs.110).aspx)を登録します。 – Clemens

+1

おそらく、MSDNページ[依存関係プロパティのコールバックと検証](https://msdn.microsoft.com/en-us/library/ms745795(v=vs.110).aspx)で説明されているように、 'ValidateValueCallback'を使用することができます。 – Rachel

答えて

2

一般的に、この問題に対処するには2つの方法があります。

それらが等しい決してならないように、私は

値を変更するために強制メカニズムを使用してのアプローチ。プロパティのメタデータを使用してCoerceValueCallbackを登録できます。もしによって値を変更する可能性がコールバックメソッドでは、例えば、double.Epsilonを減算/加算:MaximumAngleため

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

強制コールバックは、対称的であろう。

アプローチII

あなたCreateTickLines方法では、この特殊なケースを処理します。コントロールの目的と実装の詳細に応じて、それを達成するための多くの方法があります。ここに私の心に来ているいくつかは、(私が正しくあなたのコードを解釈すると仮定して)です:

  • 何もしない、すなわちCreateTickLinesメソッドの開始時にチェックを追加して、両方の性質が
  • クリアし、すべての既存等しい場合は、単純に戻りますチックラインを作成して新規のものを作成しない
  • に対応する1つのティックを作成する一般的には、「狂っていない」コードの部分だけを実行し、コードの一部には依存しませんそれは "狂ってしまう"

私の個人的なアドバイスは、特にこのような状態が無効ではなく、あなたの扱いに不都合があるため、この要件が存在しない場合は2番目の方法をとることです。

関連する問題