Почему мой ObservableCollection не обновляет пользовательский интерфейс при изменении, если он не был инициализирован при создании? - PullRequest
0 голосов
/ 20 июня 2019

Я часами сталкивался с этой проблемой и не могу понять, почему это происходит:

У меня есть ObservableCollection внутри модели моего вида.Со следующим кодом все работает нормально:

class ExcelViewModel
{
  public ObservableCollection<EPCInformation> EPCEntries { get; set; }

  public ExcelViewModel()
  {
    EPCEntries = new ObservableCollection<EPCInformation>();
  }

  void AddEntry()
  {
    EPCEntries.Add(new EPCInformation
    {
      HexEPC = "TEST"
    });
  }
}

Но если я не инициализирую EPCEntries при построении, а просто устанавливаю его на ObservableCollection, созданный позже, мой пользовательский интерфейс не обновляется:

class ExcelViewModel
{
  public ObservableCollection<EPCInformation> EPCEntries { get; set; }

  public ExcelViewModel()
  {
  }

  void AddEntry()
  {
    ObservableCollection<EPCInformation> tmp = new ObservableCollection<EPCInformation>();
    tmp.Add(new EPCInformation
    {
      HexEPC = "TEST"
    });
    EPCEntries = tmp;
  }
}

AddEntry() вызывается по нажатию кнопки в обоих случаях.

Я новичок в WPF и C #, но я думал, что во втором случае возникает другой тип события ипоэтому пользовательский интерфейс не обновляется.Хотя я не мог понять это.

Чего мне не хватает?

1 Ответ

1 голос
/ 20 июня 2019

Вот как вы можете изменить свой класс для реализации INotifyPropertyChanged для правильного обновления пользовательского интерфейса.

public class ExcelViewModel : INotifyPropertyChanged
{
   //add private member and use RaisePropertyChanged in setter. 
   private ObservableCollection<EPCInformation> _epcEntries;
   public ObservableCollection<EPCInformation> EPCEntries 
   { 
         get {return _epcEntries;} 
         set
         {
            if (value == _epcEntries) return;
            _epcEntries = value;
            RaisePropertyChanged();
         }
   }

   public ExcelViewModel()
   {
     EPCEntries = new ObservableCollection<EPCInformation>();
   }

   void AddEntry()
   {
      EPCEntries.Add(new EPCInformation{HexEPC = "TEST"});
   }

   public event PropertyChangedEventHandler PropertyChanged;

   protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
   {
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}
...