我有一个使用CSLA 3.0.2的项目。
我有一个具有IsDefault属性的子项的BusinessListBase集合对象。
当子对象的IsDefault属性设置为true时,我希望将其他子成员的IsDefault属性设置为false。
我在子setter中调用了OnPropertyChanged("IsDefault"),并引发了集合ListChanged事件。但是,事件的发送方是Collection对象,而不是引发事件的子对象。ListChangedEventArgs (e)中的子项也不是。
如何获取对引发事件的特定子实例的引用?
或者我应该用另一种方式做这件事?比如在子setter中获取对父元素的引用并在那里执行?
任何帮助都是非常感谢的。
发布于 2013-12-06 20:09:10
我从3.6开始使用CSLA,但我认为这在CSLA 3中也适用:
您会发现在BusinessListBase集合类中有一个可以覆盖的OnChildChanged方法。该方法有一个参数Csla.Core.ChildChangedEventArgs,其中包含对已更改的子对象的引用,以及已更改的对象的哪个属性。
然后,您可以在该方法中循环集合中的其他子项,将它们设置为IsDefault = false。
protected override void OnChildChanged(Csla.Core.ChildChangedEventArgs e)
{
base.OnChildChanged(e);
switch (e.PropertyChangedArgs.PropertyName)
{
case "IsDefault":
if ( ((ChildObjectType)e.ChildObject).IsDefault == true )
{
// then loop all the other childern
foreach (ChildObjectType child in this)
{
if (child != e.ChildObject && child.IsDefault == true)
{
child.IsDefault = false;
}
}
}
break;
}
}如果这不起作用,那么另一种方法是使用子对象中的Parent属性来获取对集合的引用,然后调用您在BLB集合中编写的更新其他子对象的方法。根据您的类的设置方式,您可能需要查看父级的父级。
https://stackoverflow.com/questions/20386442
复制相似问题