如果标题具有误导性,我会道歉,但我不确定在这里我要找的是什么。我有以下“主要”课程:
public class Entity : INotifyPropertyChanged
{
public string Name { get; set; }
public EntityRole Role { get; set; }
public EntityStats Stats = new EntityStats();
//Other stuff....
}
还有......子课程? (正确的名称将被赞赏)...被称为EntityStats
:
public class EntityStats : INotifyPropertyChanged
{
public int CurrentHealth
{
get { return _currentHealth; }
set
{
if (value != _currentHealth)
{
_currentHealth = value;
OnPropertyChanged("CurrentHealth");
}
}
}
//other properties...
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
}
Entity
对象包含EntityStats
类型的属性。
在我的代码的另一面,我正在注册一个Entity
对象来监听PropertyChanged
个事件:
public void RegisterEntity(Entity entity)
{
entity.Stats.PropertyChanged += entity_PropertyChanged;
}
void entity_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "CurrentHealth")
{
Message.Write("CurrentHealth property changed!");
DeathCheck((Entity)sender);
}
}
我遇到的问题是DeathCheck((Entity)sender);
- 因为CurrentHealth
OnPropertyChanged
事件是EntityStats
类的一部分,所以对象的类型为{{1} },只包含我需要的部分数据。
如何确定EntityStats
所属的Entity
对象,或如何重构此代码,以便sender
内的属性发生更改时,在EntityStats
班级中提出了一个事件?
答案 0 :(得分:4)
您可以在Entity构造函数中侦听EntityStats事件并调度实体事件。像这样:
public class Entity : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Entity() {
Stats.PropertyChanged += Stats_PropertyChanged
}
//Other stuff....
void Stats_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
e.PropertyName = "Stats." + e.PropertyName;
PropertyChanged(this, e);
}
}
}
现在,在 RegisterEntity 中,侦听器方法可以直接关联到Entity实例:
public void RegisterEntity(Entity entity)
{
entity.PropertyChanged += entity_PropertyChanged;
}
并且侦听器方法的发件人是Entity实例,但是可以识别属性是否在Stats属性中更改:
void entity_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Stats.CurrentHealth")
{
Message.Write("Stats.CurrentHealth property changed!");
DeathCheck((Entity)sender);
}
}
答案 1 :(得分:1)
您可以为EntityStats
类提供一个名为Entity
(或某些)的属性,并在EntityStats
构造函数中设置该属性:
public class Entity : INotifyPropertyChanged
{
public string Name { get; set; }
public EntityRole Role { get; set; }
public EntityStats Stats = new EntityStats(this);
//Other stuff....
}
public class EntityStats : INotifyPropertyChanged
{
private Entity _entity;
public Entity Entity
{
get { return _entity; }
}
public EntityStats(Entity entity)
{
_entity = entity;
}
// ...
}