Apache flex 当你有两个;“相同”;FlexDataGrid中的对象,则只能选择其中一个
当您的数据提供者中有两条相同的记录(即,同一对象在一个数组中出现两次)时,datagrid只允许您选择其中一条,请参见下面的示例-您只能选择最后一个“Moo”Apache flex 当你有两个;“相同”;FlexDataGrid中的对象,则只能选择其中一个,apache-flex,actionscript-3,flex3,Apache Flex,Actionscript 3,Flex3,当您的数据提供者中有两条相同的记录(即,同一对象在一个数组中出现两次)时,datagrid只允许您选择其中一条,请参见下面的示例-您只能选择最后一个“Moo” 我很确定这是因为selectedItem属性——也就是说,如果您的DataProvider中有两个相同的对象,并且您只选择它找到的第一个对象 不确定解决此问题的最佳方法。我可以通过克隆所有对象来确保每个对象都是唯一的。但是,我必须确保“a”对象上的更新被传播到“a”的所有“克隆” 有人有什么建议或想法吗?为什么需要将同一对象放入数据网
我很确定这是因为selectedItem属性——也就是说,如果您的DataProvider中有两个相同的对象,并且您只选择它找到的第一个对象
不确定解决此问题的最佳方法。我可以通过克隆所有对象来确保每个对象都是唯一的。但是,我必须确保“a”对象上的更新被传播到“a”的所有“克隆”
有人有什么建议或想法吗?为什么需要将同一对象放入数据网格两次?问题不在于您有两个具有相同标题的对象,而在于您使用了两次相同的对象引用。数据网格中的每个属性可以有两个值完全相同的对象,并且可以按照下面的代码选择所有对象
var a:Object={Title: "Moo"};
var b:Object={Title: "Goo"};
var c:Object={Title: "Foo"};
var d:Object={Title: "Moo"};
sourceData.push(a, b, c, d);
如果不能确保源数据不包含重复的对象引用,则可以通过执行以下操作来删除它们:
var ac:ArrayCollection=new ArrayCollection();
for (var i:int=0; i < sourceData.length; i++)
{
var obj:Object=sourceData[i];
if (!ac.contains(obj))
{
ac.addItem(obj);
}
}
dg.dataProvider=ac;
var ac:ArrayCollection=new ArrayCollection();
对于(变量i:int=0;i
谢谢菲尔
对我来说,主要的问题是该网格中的数据来自数据的主副本,用例是允许用户将主副本中的相同项目多次添加到此网格中
因此,我确保唯一引用的唯一方法是克隆对象。但是,对主副本的更新不会向下流到克隆
最后,我开始使用绑定,它实际上运行得很好,但我不确定它在更大的数据集上会如何运行
package
{
import mx.binding.utils.BindingUtils;
[Bindable]
public class TestVO
{
public var a:int = 0;
public var b:int = 0;
public var c:int = 0;
public function TestVO()
{
}
public function clone():TestVO {
var t:TestVO = new TestVO();
t.a = BindingUtils.bindProperty(t,"a",this,"a").getValue() as int;
t.b = BindingUtils.bindProperty(t,"b",this,"b").getValue() as int;
t.c = BindingUtils.bindProperty(t,"c",this,"c").getValue() as int;
return t;
}
}
}
我最近遇到了同样的问题。不确定我的解决方案是好是坏。我曾考虑过使用绑定,但按照应用程序的结构,我希望能够明确地判断对象是否是克隆,但仍然能够使用像主对象一样的克隆 因此,我最终使用了两个类,维护起来比较麻烦,但是更新是通过getter/setter运行的,而不是通过绑定运行的,绑定的扩展性可能更好,因为它不等待更改事件。老实说,我不知道哪种方法的伸缩性更好,对这两种方法进行基准测试并查看可能会很有趣 我觉得应该有更好的方法使用反射或其他方法来实现这一点,但我不知道……出于类型检查和数据绑定的目的,它可能仍然需要是一个类 所以基本上我是这样结束的:
package
{
import flash.events.EventDispatcher;
[Bindable]
public class MasterObject extends EventDispatcher
{
public var a:int = 0;
public var b:int = 0;
public var c:int = 0;
public function MasterObject()
{
super();
}
public function clone():MasterObject
{
return new CloneObject(this);
}
}
}
package
{
[Bindable]
public class CloneObject extends MasterObject
{
private var parent:MasterObject;
public function CloneObject(parent:MasterObject)
{
super();
this.parent = parent;
}
override public function get a():int
{
return parent.a;
}
override public function set a(value:int):void
{
parent.a = value;
}
override public function get b():int
{
return parent.b;
}
override public function set b(value:int):void
{
parent.b = value;
}
override public function get c():int
{
return parent.c;
}
override public function set c(value:int):void
{
parent.c = value;
}
}
}
只是出于好奇,你想完成什么?
package
{
import flash.events.EventDispatcher;
[Bindable]
public class MasterObject extends EventDispatcher
{
public var a:int = 0;
public var b:int = 0;
public var c:int = 0;
public function MasterObject()
{
super();
}
public function clone():MasterObject
{
return new CloneObject(this);
}
}
}
package
{
[Bindable]
public class CloneObject extends MasterObject
{
private var parent:MasterObject;
public function CloneObject(parent:MasterObject)
{
super();
this.parent = parent;
}
override public function get a():int
{
return parent.a;
}
override public function set a(value:int):void
{
parent.a = value;
}
override public function get b():int
{
return parent.b;
}
override public function set b(value:int):void
{
parent.b = value;
}
override public function get c():int
{
return parent.c;
}
override public function set c(value:int):void
{
parent.c = value;
}
}
}