当项目被添加时,Observablecollection不更新列表

Hal*_*iaz 4 c# wpf listview mvvm

我正在使用MVVM模式,并希望使用可观察的集合更新ListView.我经历了几个SO问题,但看不出我做错了什么.任何帮助深表感谢.谢谢.

View.xaml

命名空间: xmlns:local="clr-namespace:MusicPlayer.ViewModel"

DataContext的

<UserControl.DataContext>
    <local:AllTracksViewModel/>
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)

列表显示

<ListView x:Name="TrackListView" 
                  ItemsSource="{Binding Path=TrackListObservable}">
...
<ListView.View>
   <GridView>
     <GridViewColumn Header="Title" Width="250" DisplayMemberBinding="{Binding Title}" />
      <GridViewColumn Header="Album" Width="200" DisplayMemberBinding="{Binding Album}" />
      <GridViewColumn Header="Artist" Width="150" DisplayMemberBinding="{Binding Artist}" />
      <GridViewColumn Header="Duration" Width="100" DisplayMemberBinding="{Binding FormattedDuration}" />
      </GridView>
    </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

ViewModel.cs

public class AllTracksViewModel
{
    public ObservableCollection<Track> TrackListObservable { get; private set; }

    public AllTracksViewModel()
    {
        TrackListObservable = new ObservableCollection<Track>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我确认项目肯定会被添加到observable中.再一次感谢你的帮助.

Arn*_*eil 5

将您的代码更改为:

public class AllTracksViewModel : INotifyPropertyChanged
{
    ObservableCollection<Track> trackListObservable;

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Track> TrackListObservable {
      get { return trackListObservable; }
      set {
        trackListObservable = value;
        if(PropertyChanged!=null) {
          PropertyChanged(this, new PropertyChangedEventArgs("TrackListObservable"));
        }
      }
}

    public AllTracksViewModel()
    {
        TrackListObservable = new ObservableCollection<Track>();
    }
}
Run Code Online (Sandbox Code Playgroud)

只是为了解释原因:ViewModel的每个属性都应该通知它的更改.

  • @HaloMediaz不完全 - ObservableCOllection实现了INotifyCollectionChanged,这样当添加/删除项时,任何绑定都会更新.您仍然需要实现INotifyPropertyChanged并让各个属性通知它们已更新,否则绑定子系统将永远不会知道可观察集合已分配给该属性. (4认同)
  • @slugster花了几个小时的时间搜索"你还需要实现INotifyPropertyChanged并让个别属性通知他们已经更新了,否则......"是关键短语.我正在使用Prism库,但是一旦我意识到个别属性也需要设置通知,这一切都有效.谢谢! (2认同)