2016-01-05 28 views
1

道歉标题有误导之嫌,但我不知道确切地称之为什么,我这里寻找。我有以下“主要”类:事件处理 - 发件人为主要类别中,如果

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); - 因为CurrentHealthOnPropertyChanged事件是部分EntityStats类,该对象的类型为EntityStats,其中只包含我需要的部分数据。

我如何确定Entity对象sender所属的我怎么能重构这个代码,以便当内EntityStats变化的特性,在Entity类引发的事件?

+1

有很多方法可以做到这一点。在entitystat中创建父属性并存储实体对象。这样你可以访问entitiy属性。不过,根据您的要求,我认为从实体而不是entitystat公开事件会很有用。 – XtremeBytes

+0

@XtremeBytes感谢您的评论。你能否提供一个答案来展示如何从“实体”类暴露事件?这样做对我来说最有意义,但是我不太清楚如何实现它,因为CurrentHealth是EntityStats的一个属性。 – levelonehuman

回答

4

你可以听的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,听者方法可以关联直接到实体实例:

public void RegisterEntity(Entity entity) 
{    
    entity.PropertyChanged += entity_PropertyChanged;   
} 

和侦听器方法的发送者是实体实例,但可能确定属性是否在Stats属性中更改:

void entity_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Stats.CurrentHealth") 
    { 
     Message.Write("Stats.CurrentHealth property changed!"); 
     DeathCheck((Entity)sender); 
    } 
} 
+0

因此,这注册了'Entity'对象来侦听'EntityStats'上的'PropertyChanged'事件? – levelonehuman

+0

是的。就耦合而言,Entity已经具有EntityStats的依赖性。但EntityStats不需要实体的依赖。 –

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

    // ... 
} 
+0

欣赏答案,这是有道理的!从设计的角度来看,是否有任何问题有一个子类(或任何'EntityStats'将在这种情况下被调用..我不知道!)持有对其父项的引用? – levelonehuman

+0

取决于你是否会永远想,例如,共享一个'两个'Entity'对象之间EntityStats'或围绕它传递给代码,不应该知道它的父。 – adv12

+0

也许这是它开始设计的一个问题 - “EntityStats”的基本概念是一组属性('health','damage','defense'等),我将它们分解为单独的类,而不是将它们作为“实体”类中的属性列出。 – levelonehuman

相关问题