编辑该属性的成员时设置的触发器属性

时间:2014-11-07 09:49:07

标签: c# properties

我有一个Angle类,它有2个属性(Degree和Radians)。 然后在另一个类中,我有一个带有get和set访问器的Angle属性。设置Angle属性时有没有办法触发该属性集?

public Angle RotationAngle
{
  get { return _rotationAngle; }
  set
  {
    //this should trigger when setting RoationAngle.Deg
  }
}
private Angle _rotationAngle;

RotationAngle.Deg = 5;

1 个答案:

答案 0 :(得分:2)

看起来像一个糟糕的设计选择,你通常不希望设置一个属性的值也应该设置另一个属性的值。

我想你可以试试这个。

Angle上创建构造函数:

public Angle(float deg, float rad)
{
    this.Deg = deg;
    this.Rad = rad;
}

Angle类上设置自动属性,并在设置Deg时设置该属性:

public float Deg
{
    get
    {
        return _deg;
    }
    set
    {
        _deg = value;
        this.RotationAngle = new Angle(value, _rad);
    }
}

public Angle RotationAngle
{
    get;
    set;
}

然后,您可以从其他班级访问RotationAngle

或者,您可以查看INotifyPropertyChanged界面,并在设置Deg时触发事件,例如:

public class Angle : INotifyPropertyChanged
{
    private float _deg;
    private float _rad;
    public event PropertyChangedEventHandler PropertyChanged;

    public Angle() { }

    public Angle(float deg, float rad)
    {
        this.Deg = deg;
        this.Rad = rad;
    }

    public float Deg
    {
        get
        {
            return _deg;
        }
        set
        {
            _deg = value;
            OnPropertyChanged("Deg");
        }
    }

    public float Rad
    {
        get
        {
            return _rad;
        }
        set
        {
            _rad = value;
        }
    }

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
}

然后,在您的其他课程中,您将在创建Angle实例时订阅该事件,并在事件触发时设置RotationAngle

Angle angle = new Angle();   
angle.PropertyChanged += angle_PropertyChanged;

static void angle_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
     // You would set `RotationAngle` here
     this.RotationAngle = foo;
}
相关问题