Изменение свойства ассоциации (EntityCollection) не вызывает PropertyChanged - PullRequest
2 голосов
/ 07 июня 2011

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

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 Ответ

1 голос
/ 08 июня 2011

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

  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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...