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