事件处理 - 发件人作为主要类

时间:2016-01-05 22:10:35

标签: c# events

如果标题具有误导性,我会道歉,但我不确定在这里我要找的是什么。我有以下“主要”课程:

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班级中提出了一个事件?

2 个答案:

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

    // ...
}