4

たとえば、オンザフライでプロパティを計算するクラスがあります。

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 に 2 つのテキスト ボックスがあり、1 つは TwoWay が Radius にバインドされ、もう 1 つは OneWay が Area にバインドされています。

Radius のテキスト ボックスを編集して Area のテキスト ボックスを更新するにはどうすればよいですか?

4

1 に答える 1

3

これを行うにはいくつかの方法があります。

  • 簡単にするために、 を実装しINotifyPropertyChanged、 Area に通常のプロパティを使用してから、OnDependencyPropertyChangedfor でイベントをトリガーできRadiusPropertyます。
  • より複雑にするために、AreaPropertyRadius が変更されるたびにキーを非公開で使用するように設定します。あなたの財産はこのようになります。

    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

于 2013-04-01T14:38:55.927 に答える