C#:一个类Person 属性有:Name、Age、Sex另一个类PersonList,它是一个Person对象的集合类,即PersonList是个List<Person>我现在要这样的效果:当personList中,只要有一个Person的某个属性发生了变化,就触发一个MemberAttribChanged事件请问该怎么写?

解决方案 »

  1.   

    对 Person 添加 AttribChanged 事件更合理一些
      

  2.   

    对 Person 添加 AttribChanged 事件更合理一些
    -------------------------------
    对Person添加了还是要作用到personList的  将personList看作一整体 MemberAttribChanged是它的一个属性   代表他的某个成员属性发生了变化  要这样的设计
      

  3.   

    按你的需要,如果你不想在 Person 里直接添加通知事件的话,那么你必须对 PersonList 的某元素重新赋值才能触发更改的事件,比如 PersonList[i] = Person ,但这样做好像不太好可以考虑用以下方式。
    Person.OnChage += PersonList.MemberAttribChanged;
      

  4.   

    比如Person里的Name属性:Public string Name
    {
       get{return _name;}
       set{
            if(_name!=value)
             {
                  _name=value;
                  MemberAttribChanged();//触发你的事件
               }
           }
    }
      

  5.   

    按楼上做法,MemberAttribChanged()放在PersonList中定义,放在Person里触发,这样可以么???
      

  6.   

    请参阅IPropertyChange接口含义及其实现技巧
      

  7.   

    1.首先, 你要在Person中添加成员PersonList.重写PersonList的add,remove 方法.
    例如:
    public override void Add(Person obj)
    {
       base.Add(obj);
       if(obj != null) 
       {
        obj.ParentList = this;
        obj.PropertyChanged += new EventHandler(MemberChanged);
       }
    }
    public override void Remove(Person obj)
    {
       base.Remove(obj);
       if(obj != null) 
       {  
          obj.ParentList = null;
        obj.PropertyChanged -= MemberChanged;
       }
    }
    private void MemberChanged(object sender,EventArgs e)
    {
       //List 事件
       
    }
    ///
    2.然后在Person的各个属性变更的时候触发事件
    例如:
    event EventHandler PropertyChanged ;
    public string Name
    {
       get{return _name;}
       set{ 
             _name = value;
             if(this.PropertyChanged != null )
                PropertyChanged(this, new EventArgs());
           }
    }另外的4L的更简单.
      

  8.   


    如果你的MemberChanged在PersonList里面,那你就用楼上的这个做法,楼这个是漏了判断属性值有没有变化。
     if(_name!=value)
          {
            _name = value;
            if(this.PropertyChanged != null )
                PropertyChanged(this, new EventArgs());
          }
      

  9.   

    4楼的我知道是简单,但不符合我的应用要求,我的需求是这样的:我有一个员工职称档案列表 要求里面只要有一个员工的姓名、单位或职称什么的发生了变化,立即刷新界面显示,员工大概有300人,我不可能为300的人来300个+=和-=吧?  用for循环也感觉不好,所以想将列表本身作为一个整体来看待
      

  10.   

    Public string Name
    {
       get{return _name;}
       set{
            if(_name!=value)
             {
                  _name=value;
                  MemberAttribChanged();//触发你的事件
               }
           }
    }
    正解PERSONLIST写一个注册器,每加进一个PERSON就把MemberAttribChanged注册到PERSONLIST的容器里,这个容器不管是什么,只要能接受MemberAttribChanged类型就可以,PERSONLIST在起一个事件,这个事件就是当容器里任何一个MemberAttribChanged事件触发的时候这个事件就触发,至于参数你完全可以放一个PERSONID用于鉴别。