2016-04-09 10 views
0

У меня есть класс:Propagate PropertyChanged в MVVM Windows Phone 8,1

public class Collection : INotifyPropertyChanged 
{ 
    public Collection() 
    { 
     this.tracks = new ObservableCollection<Track>(); 
    } 

    public void addTrack(Track track) 
    { 
     if (this.tracks.Contains(track)) return; 

     this.tracks.Add(track); 
     RaisePropertyChanged("tracks"); 
    } 

    public ObservableCollection<Track> tracks 
    { 
     get 
     { 
      return _tracks; 
     } 
     set 
     { 
      if (_tracks != value) 
      { 
       _tracks = value; 
       RaisePropertyChanged("tracks"); 
      } 
     } 
    } 
    private ObservableCollection<Track> _tracks; 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

И в ViewModel:

public class ScanningPageViewModel : ViewModelBase 
{ 
    private INavigationService navigationService; 

    public ScanningPageViewModel(INavigationService navigationService) 
    { 
     App.Collection.PropertyChanged += Collection_PropertyChanged; 

     this.navigationService = navigationService; 
     this.LoadData(); 
    } 

    private async void LoadData() 
    { 
     await CollectionService.PopulateCollection(); 
     this.navigationService.NavigateTo("MainPage"); 
    } 

    public int CollectionCount 
    { 
     get 
     { 
      return App.Collection.tracks.Count; 
     } 
    } 

    public void Collection_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     RaisePropertyChanged("CollectionCount"); 
    } 
} 

В основном я хочу, чтобы поднять свойство изменилось "CollectionCount" каждый раз, когда мои изменения Коллекция ,

я бы подумал, что

App.Collection.PropertyChanged += Collection_PropertyChanged; 

будет делать трюк, но метод не вызывался (в RaisePropertyChanged в классе коллекции!) ...

Я новичок в MVVM поэтому я мог бы пропустить что-то очевидное здесь, но я этого не вижу.

+1

Вы пытались отладить приложение? Вы уверены, что коллекция в 'App.Collection.PropertyChanged + = Collection_PropertyChanged;' является той же коллекцией, которая впоследствии изменяется? Если это так, то дважды проверьте, что он имеет обработчик события 'Collection_PropertyChanged' в своем списке вызовов PropertyChanged, и что' this.PropertyChanged (this, new PropertyChangedEventArgs (propertyName)); 'на самом деле вызывается. –

+0

Вы были правы, я снова инициализировал App.Collection, чтобы ViewModel больше не указывал на правильный экземпляр Collection. –

ответ

0

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

Collection.Tracks.CollectionChanged + = OnTracksCollectionChanged;