更改关联属性(EntityCollection)不会上升PropertyChanged

时间:2011-06-07 12:14:49

标签: silverlight silverlight-4.0 entity-framework-4 wcf-ria-services

我想通过Converter将readonly DataGrid的一些列数据绑定到Entity的Association属性(将此关联属性的集合转换为string)。当我尝试从集合中添加/删除元素时,绑定不会触发。 PropertyChanged也不涨。

contractPosition.PropertyChanged += (s, e2) =>
    {
           a = 0;//don't fire
    };

contractPosition.ContractToOrderLinks.Remove(link);

这是contractPosition实体的片段(由EF4生成):

[Association("ContractPosition_ContractToOrderLink", "PositionId", "ContractPositionId")]
        [XmlIgnore()]
        public EntityCollection<ContractToOrderLink> ContractToOrderLinks
        {
            get
            {
                if ((this._contractToOrderLinks == null))
                {
                    this._contractToOrderLinks = new EntityCollection<ContractToOrderLink>(this, "ContractToOrderLinks", this.FilterContractToOrderLinks, this.AttachContractToOrderLinks, this.DetachContractToOrderLinks);
                }
                return this._contractToOrderLinks;
            }
        }

为什么PropertyChanged不上升?如何实现绑定刷新?

1 个答案:

答案 0 :(得分:1)

有几个不同的事件要听:

  1. INotifyPropertyChanged.PropertyChanged

    _contractToOrderLinks的值发生变化时触发。在示例代码中,值从不更改,事件从不调用,事件从不触发。

  2. INotifyCollectionChanged.CollectionChanged

    添加对象,删除对象以及清除集合时触发。

  3. EntityCollection<>.EntityAdded

    添加对象时触发。

  4. EntityCollection<>.EntityRemoved

    删除对象时触发。 我不确定在收集清单时是否会为每个实体触发。

  5. 我更喜欢使用INotifyCollectionChanged.CollectionChanged事件。但是,EntityCollection<>显式实现了接口,因此您必须先将其强制转换。试试这个:

    ((INotifyCollectionChanged)contractPosition.ContractToOrderLinks).CollectionChanged += (s, e) =>
        {
               a = 0; //does fire
        };
    
    contractPosition.ContractToOrderLinks.Remove(link);