事件处理-发送方为主类

本文关键字:-发 事件处理 | 更新日期: 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;
    }
    // ...
}