2013-04-01 17 views
4

我有一個類,它計算它的財產上即時,例如:在即時DependencyProperties

class CircleArea 
{ 
    public double Radius { get; set; } 
    public double Area 
    { 
     get 
     { 
      return Radius * Radius * Math.PI; 
     } 
    } 
} 

我讓一個DependencyObject的做:

class CircleArea: 
    DependencyObject 
{ 
    public static readonly DependencyProperty RadiusProperty = 
     DependencyProperty.Register("Radius", typeof(double), typeof(CircleArea)); 
    public double Radius 
    { 
     get { return (double)GetValue(RadiusProperty); } 
     set 
     { 
      SetValue(RadiusProperty, value); 
      CoerceValue(AreaProperty); 
     } 
    } 

    internal static readonly DependencyPropertyKey AreaPropertyKey = 
     DependencyProperty.RegisterReadOnly("Area", typeof(double), typeof(CircleArea), new PropertyMetadata(double.NaN)); 
    public static readonly DependencyProperty AreaProperty = AreaPropertyKey.DependencyProperty; 
    public double Area 
    { 
     get 
     { 
      return Radius * Radius * Math.PI; 
     } 
    } 
} 

然後我在XAML中有兩個文本框,一個使用TwoWay綁定到Radius,另一個使用OneWay綁定到區域。

我該如何編輯Radius的文本框來更新Area的文本框?

+0

我嘗試過'CoerceValue(AreaProperty);'和'InvalidateProperty(AreaProperty);',但它們都不起作用。 –

回答

2

有幾種方法可以做到這一點。

  • 爲了簡單起見,可以實現INotifyPropertyChanged,使用常規的屬性區域,然後觸發該OnDependencyPropertyChanged的事件RadiusProperty
  • 爲了更加複雜,只要Radius改變,您就可以私鑰設置AreaProperty。你的財產看起來像這樣。

    public static readonly DependencyProperty RadiusProperty = 
        DependencyProperty.Register(
         "Radius", 
         typeof(double), 
         typeof(CircleArea), 
         new FrameworkPropertyMetadata(0.0, OnRadiusChanged)) 
    
    
    private static void OnRadiusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
        Area = Radius * Radius * Math.PI; 
    } 
    
    
    
    private static readonly DependencyPropertyKey AreaKey= 
        DependencyProperty.RegisterReadOnly("Area", typeof(double)... 
    public static readonly DependencyProperty AreaProperty = AreaKey.DependencyProperty; 
    
    public Double Area 
    { 
        get 
        { 
         return (Double)GetValue(AreaProperty); 
        } 
        private set 
        { 
         SetValue(AreaKey, value); 
        } 
    } 
    

,您仍然可以設置單向綁定Area