【问题标题】:Propagate PropertyChanged in MVVM Windows Phone 8.1在 MVVM Windows Phone 8.1 中传播 PropertyChanged
【发布时间】:2016-04-09 15:52:45
【问题描述】:

我有一堂课:

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");
    }
}

基本上,我想在每次我的 Collection 更改时为“CollectionCount”设置一个更改的属性。

我会这么认为

App.Collection.PropertyChanged += Collection_PropertyChanged;

可以解决问题,但没有调用该方法(Collection 类中的 RaisePropertyChanged 是!)...

我是 MVVM 的新手,所以我可能会在这里错过一些明显的东西,但我没有看到它。

【问题讨论】:

  • 您是否尝试过调试您的应用程序?您确定App.Collection.PropertyChanged += Collection_PropertyChanged; 中的集合与后来更改的集合是同一个集合吗?如果是这样,请仔细检查它的PropertyChanged 调用列表中是否有Collection_PropertyChanged 事件处理程序,以及this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 是否实际被调用。
  • 你是对的,我在某个地方再次初始化了 App.Collection,这样 ViewModel 就不再指向正确的 Collection 实例了。

标签: c# mvvm windows-phone-8.1 inotifypropertychanged


【解决方案1】:

您没有收到 PropertyChanged 事件,因为它调用得太早了。构造集合时调用它。您不想知道整个集合实例何时更改,而是想知道集合中的项目何时更改。在这种情况下使用这个事件

Collection.Tracks.CollectionChanged += OnTracksCollectionChanged;

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2015-11-26
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多