C# : 这 样 的 属 性 | 事 件 该 怎 么 写 ? C#:一个类Person 属性有:Name、Age、Sex另一个类PersonList,它是一个Person对象的集合类,即PersonList是个List<Person>我现在要这样的效果:当personList中,只要有一个Person的某个属性发生了变化,就触发一个MemberAttribChanged事件请问该怎么写? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对 Person 添加 AttribChanged 事件更合理一些 对 Person 添加 AttribChanged 事件更合理一些-------------------------------对Person添加了还是要作用到personList的 将personList看作一整体 MemberAttribChanged是它的一个属性 代表他的某个成员属性发生了变化 要这样的设计 按你的需要,如果你不想在 Person 里直接添加通知事件的话,那么你必须对 PersonList 的某元素重新赋值才能触发更改的事件,比如 PersonList[i] = Person ,但这样做好像不太好可以考虑用以下方式。Person.OnChage += PersonList.MemberAttribChanged; 比如Person里的Name属性:Public string Name{ get{return _name;} set{ if(_name!=value) { _name=value; MemberAttribChanged();//触发你的事件 } }} 按楼上做法,MemberAttribChanged()放在PersonList中定义,放在Person里触发,这样可以么??? 请参阅IPropertyChange接口含义及其实现技巧 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的更简单. 如果你的MemberChanged在PersonList里面,那你就用楼上的这个做法,楼这个是漏了判断属性值有没有变化。 if(_name!=value) { _name = value; if(this.PropertyChanged != null ) PropertyChanged(this, new EventArgs()); } 4楼的我知道是简单,但不符合我的应用要求,我的需求是这样的:我有一个员工职称档案列表 要求里面只要有一个员工的姓名、单位或职称什么的发生了变化,立即刷新界面显示,员工大概有300人,我不可能为300的人来300个+=和-=吧? 用for循环也感觉不好,所以想将列表本身作为一个整体来看待 Public string Name{ get{return _name;} set{ if(_name!=value) { _name=value; MemberAttribChanged();//触发你的事件 } }}正解PERSONLIST写一个注册器,每加进一个PERSON就把MemberAttribChanged注册到PERSONLIST的容器里,这个容器不管是什么,只要能接受MemberAttribChanged类型就可以,PERSONLIST在起一个事件,这个事件就是当容器里任何一个MemberAttribChanged事件触发的时候这个事件就触发,至于参数你完全可以放一个PERSONID用于鉴别。 关于dataviewlist webservice性能问题咨询 public Node(object value) : this(value, null) { }设么意思? 怎样在按钮事件中调用外部应用程序? C#中用正则表达式抽取中文字符? c# 在线播放数据库中的视频问题 简单问题,紧急~~~~~~~在线等!!! c# winform中怎样判断TreeView中的节点有没被选中,请大家指点指点。 简单的pagecontrol问题 连不上网络就提示SQL不存在或拒绝访问,连上网络就没问题,怎么回事?? 动态绘制窗体填写表单加入验证? 怎么让它消失?GDI问题
-------------------------------
对Person添加了还是要作用到personList的 将personList看作一整体 MemberAttribChanged是它的一个属性 代表他的某个成员属性发生了变化 要这样的设计
Person.OnChage += PersonList.MemberAttribChanged;
{
get{return _name;}
set{
if(_name!=value)
{
_name=value;
MemberAttribChanged();//触发你的事件
}
}
}
例如:
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的更简单.
如果你的MemberChanged在PersonList里面,那你就用楼上的这个做法,楼这个是漏了判断属性值有没有变化。
if(_name!=value)
{
_name = value;
if(this.PropertyChanged != null )
PropertyChanged(this, new EventArgs());
}
{
get{return _name;}
set{
if(_name!=value)
{
_name=value;
MemberAttribChanged();//触发你的事件
}
}
}
正解PERSONLIST写一个注册器,每加进一个PERSON就把MemberAttribChanged注册到PERSONLIST的容器里,这个容器不管是什么,只要能接受MemberAttribChanged类型就可以,PERSONLIST在起一个事件,这个事件就是当容器里任何一个MemberAttribChanged事件触发的时候这个事件就触发,至于参数你完全可以放一个PERSONID用于鉴别。