4

У меня есть Entity Framework модельUpdate Entity Framework свойство, когда другая собственность в модели изменяется

public partial class Product 
{ 
    public Product() 
    { 
     this.Designs = new HashSet<Design>(); 
    } 

    public int BookingProductId { get; set; } 
    public System.Guid BookingId { get; set; } 
    public decimal Price { get; set; } 

    public virtual Booking Booking { get; set; } 
    public virtual ICollection<Design> Designs { get; set; } 
} 

... в котором я хотел бы обновить свойство Цены в ответ на новый дизайн добавляется к Продукт. Я пытался следовать этому примеру:

How can I change an Entity Framework ICollection to be an ObservableCollection?

поэтому мой класс выглядит следующим образом:

public partial class Product : INotifyPropertyChanged 
{ 
    public Product() 
    { 
     this.Designs = new ObservableCollection<Design>(); 
    } 

    public int BookingProductId { get; set; } 
    public System.Guid BookingId { get; set; } 
    public decimal Price { get; set; } 

    public virtual Booking Booking { get; set; } 
    public virtual ObservableCollection<Design> Designs { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

, но если добавить новый дизайн продукта, как так

product.Designs.Add(new Design()); 

, то метод NotifyPropertyChanged никогда не запускается. Кто-нибудь знает, почему ???

Заранее спасибо

+1

Основываясь на некоторых ответах на другие вопросы, я думаю, вы должны смотреть на 'INotifyCollectionChanged' события. –

ответ

3

NotfiyPropertyChanged будет вызываться только при установке всей коллекции, а не входящих элементов.

Это обходной путь для problme:

public partial class Product : INotifyPropertyChanged 
{ 
    public Product() 
    { 
     this.Designs = new ObservableCollection<Design>(); 
     this.Designs.CollectionChanged += ContentCollectionChanged; 
    } 

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // This will get called when the collection is changed 
     // HERE YOU CAN ALSO FIRE THE PROPERTY CHANGED 
    } 

    public int BookingProductId { get; set; } 
    public System.Guid BookingId { get; set; } 
    public decimal Price { get; set; } 

    public virtual Booking Booking { get; set; } 
    public virtual ObservableCollection<Design> Designs { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

Отлично, спасибо. Я также заметил, что событие ContentCollectionChanged запускается, когда я извлекаю объект продукта из базы данных и включаю проекты, что имеет смысл, но мне интересно, есть ли способ отличить это от того, когда я .Add (новый дизайн ()); ??? – ledragon

+0

Обычно вам этого не нужно, допустим, вы используете шаблон MVVM, и вы связали свою коллекцию с ListBox. ListBox запустит это событие, например SelectedItem (s) Changed и т. Д. –

+0

Не уверен, что я это понимаю ... Могу ли я перефразировать? Я получил Продукт и связанные с ним проекты из базы данных: var product = this.GetDbSet (). Включить (c => c.BookingDesigns) .Single (c => c.BookingProductId == bookingProductId); В этот момент каждый раз, когда к продукту добавляется проект, загорается ContentCollectionChanged. Затем я хочу добавить новый дизайн так ... product.Designs.Add (new Design()); и ContentCollectionChanged также уволен. Именно в этот момент я хочу выполнить действие над ценовым свойством продукта, а не при получении из БД. Имеет ли это смысл? – ledragon

3

NotifyPropertyChanged не срабатывает, потому что добавление еще один элемент в вашей коллекции Designs фактически не изменяет свойства любого продукта. Если вы хотите отслеживать изменения внутри самой коллекции, она должна реализовать интерфейс INotifyCollectionChanged. ObservableCollection уже реализует это, поэтому вы можете просто обработать событие CollectionChanged.

Смежные вопросы