【问题标题】:Trigger property set when editing a member of that property编辑该属性的成员时触发属性集
【发布时间】:2014-11-07 18:20:55
【问题描述】:

我有一个 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;

【问题讨论】:

  • 尝试让Angle不可变,那么你需要在每次不修改它的字段时分配Angle。

标签: c# properties


【解决方案1】:

似乎是一个糟糕的设计选择,您通常不会期望设置一个属性的值也应该设置另一个属性的值。

我想你可以试试这个。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多