Apache flex 当你有两个;“相同”;FlexDataGrid中的对象,则只能选择其中一个

Apache flex 当你有两个;“相同”;FlexDataGrid中的对象,则只能选择其中一个,apache-flex,actionscript-3,flex3,Apache Flex,Actionscript 3,Flex3,当您的数据提供者中有两条相同的记录(即,同一对象在一个数组中出现两次)时,datagrid只允许您选择其中一条,请参见下面的示例-您只能选择最后一个“Moo” 我很确定这是因为selectedItem属性——也就是说,如果您的DataProvider中有两个相同的对象,并且您只选择它找到的第一个对象 不确定解决此问题的最佳方法。我可以通过克隆所有对象来确保每个对象都是唯一的。但是,我必须确保“a”对象上的更新被传播到“a”的所有“克隆” 有人有什么建议或想法吗?为什么需要将同一对象放入数据网

当您的数据提供者中有两条相同的记录(即,同一对象在一个数组中出现两次)时,datagrid只允许您选择其中一条,请参见下面的示例-您只能选择最后一个“Moo”


我很确定这是因为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;
        }
    }
}