2016-08-31 3 views
0

У меня есть ObservableCollection, который заполняет datagrid в WPF. Мне нужно привязать к полному столбцу «Часы» и получить это общее обновление, когда значение в столбце «Часы» будет изменено. Я могу достичь этого, слушая событие «LostFocus» и запуская функцию, но хотел бы попробовать свои силы при привязке.Привязывается к общему полю элементов в ObservableCollection и обновляется при изменении значений

Проблема, с которой я столкнулся, - это событие NotifyPropertyChanged не срабатывает при изменении свойства элементов в коллекции.

Класс сортировки NotifyPropertyChanged будет срабатывать, но коллекция не интерпретирует это как изменение собственного свойства. Как я могу прослушать сортировку PropertyChanged из коллекции в классе миссий?

Мои модели

public class Mission : INotifyPropertyChanged 
{ 
    private ObservableCollection<Sortie> sorties; 
    public ObservableCollection<Sortie> Sorties 
    {    
     get { return this.sorties; } 
     set 
     { 

      if (this.sorties != value) 
      { 
       this.sorties = value;     
       this.NotifyPropertyChanged("Sorties"); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

public class Sortie : INotifyPropertyChanged 
{ 
    private double hours; 
    public double Hours 
    { 
     get {return this.hours;} 
     set 
     { 
      if (this.hours != value) 
      { 
       this.hours = value; 
       this.NotifyPropertyChanged("Hours"); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

Я не удосужился разместить свой код XAML или View Model, как я уверен, что сможет решить этот вопрос раз я узнать, как вызвать событие PropertyChanged для коллекции, и я хотел вам придется читать через огромное количество кода. Если вы считаете, что это необходимо, сообщите мне.

+0

Multidupe. OC не слушает INPC своих детей. Вы должны справиться с этим. – Will

ответ

2

Напишите свойство readonly в родительской модели, которая вычисляет значение.

public double SortieHours => Sorties.Sum(x => x.Hours); 

Родитель ViewModel обрабатывает PropertyChanged по каждому пункту в SortiesCollectionChanged и на Sorties. В CollectionChanged на Sorties вы должны добавить/удалить PropertyChanged обработчиков из Sortie экземпляров, поскольку они добавлены и удалены. Когда вы получаете новую коллекцию Sorties (возможно, вы захотите сделать этот сеттер приватным по этой причине), вам нужно выбросить все старые обработчики и добавить новые.

Теперь всякий раз, когда Sortie добавляется или удаляется, или его Hours изменения, или кто-то вручает вам новую Sorties коллекцию, поднять PropertyChanged:

OnPropertyChanged(nameof(SortieHours)); 

И связывают это свойство, что вам нравится в XAML.

Это выглядит ужасно (потому что это так), но что еще вы собираетесь делать?

Много людей посоветуете дать Sortie событие HoursChanged. PropertyChanged раздражает этот тип корпуса, потому что он может быть поднят для нескольких разных свойств, и вы должны проверить, какой из них. И это волшебная струна.

Выше C# 6. Для C# 5,

public double SortieHours { get { return Sorties.Sum(x => x.Hours); } } 

OnPropertyChanged("SortieHours"); 
+0

Ух ... так уродливо, но не может отрицать, что он работает. Спасибо. – Tronald

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