事件处理-发送方为主类
本文关键字:-发 事件处理 | 更新日期: 2023-09-27 18:29:08
如果标题有误导性,我们深表歉意,但我不确定该怎么称呼我在这里寻找的东西。我有以下"主要"类:
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
类的一部分,所以对象的类型是EntityStats
,它只包含我需要的部分数据。
如何确定sender
所属的Entity
对象,或如何重构此代码,以便在EntityStats
内的属性发生更改时,在Entity
类中引发事件?
您可以在Entity构造函数中侦听EntityStats事件并调度Entity事件。像这样:
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);
}
}
您可以为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;
}
// ...
}