Изменение свойства ассоциации (EntityCollection) не поднимается PropertyChanged

Я хочу привязать некоторые данные столбца DataGrid только для чтения к свойству ассоциации Entity через конвертер (преобразовать коллекцию из этого свойства ассоциации в строку). Когда я пытаюсь добавить/удалить элементы из коллекции, привязка не срабатывает. PropertyChange тоже не поднимается.

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 не поднимается? Как реализовать обновление привязки?


person MaxWave    schedule 07.06.2011    source источник


Ответы (1)


Есть несколько различных событий для прослушивания:

  1. INotifyPropertyChanged.PropertyChanged

    Срабатывает при изменении значения _contractToOrderLinks. В вашем примере кода значение никогда не изменяется, событие никогда не вызывается, а событие никогда не срабатывает.

  2. INotifyCollectionChanged.CollectionChanged

    Срабатывает при добавлении объекта, удалении объекта и при очистке коллекции.

  3. EntityCollection<>.EntityAdded

    Срабатывает при добавлении объекта.

  4. EntityCollection<>.EntityRemoved

    Срабатывает при удалении объекта. Я не уверен, что это срабатывает для каждого объекта при очистке коллекции.

Я предпочитаю использовать событие INotifyCollectionChanged.CollectionChanged. Однако EntityCollection<> явно реализует интерфейс, поэтому вы должны сначала привести его. Попробуй это:

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

contractPosition.ContractToOrderLinks.Remove(link);
person Ed Chapel    schedule 07.06.2011
comment
Может быть, вы хотите сказать это: contractPosition.ContractToOrderLinks.EntityRemoved += (s, e2) =› { int a = 0;//не срабатывает }; ContractPosition.ContractToOrderLinks.Remove(ссылка); Но это тоже не работает. Я не понимаю. Почему? - person MaxWave; 08.06.2011
comment
Я обновил ответ, чтобы указать ContractToOrderLinks как INCC. Ваш код должен работать. Не понятно почему нет. - person Ed Chapel; 08.06.2011
comment
Да, должно работать. Но нет! docs.google.com/ - person MaxWave; 09.06.2011
comment
Не удается преобразовать тип «System.Data.Objects.DataClasses.EntityCollection‹BusinessObjects.ServiceEvent›» в «System.Collections.Specialized.INotifyCollectionChanged» Я могу использовать только первый заданный вами вариант. - person OneWorld; 14.01.2013