2011-03-01 61 views
0

我创建了一个类田径代表在播放列表中的歌曲:数据绑定列表框将不会更新

public class Track 
{ 
    public Uri Path 
    { 
     get { return path; } 
     set { path = value; } 
    } 
    public TrackState State 
    { 
     get { return state; } 
     set { state = value; } 
    } 

    private Uri path; 
    private TrackState state; 
} 

接下来,我已经创建MainWindowController类的UI窗口和轨道类之间的交互:

public class MainWindowController : INotifyPropertyChanged 
{ 
    public ObservableCollection<Track> Playlist 
    { 
     get { return playlist; } 
     set 
     { 
      if (value != this.playlist) 
      { 
       playlist = value; 
       NotifyPropertyChanged("Playlist"); 
      } 
     } 
    } 
    public int NowPlayingTrackIndex 
    { 
     set 
     { 
      if (value >= 0) 
      { 
       playlist[nowPlayingTrackIndex].State = TrackState.Played; 
       playlist[value].State = TrackState.NowPlaying; 
       this.nowPlayingTrackIndex = value; 
      } 
     } 
    } 

    private ObservableCollection<Track> playlist; 
    private int nowPlayingTrackIndex; 
} 

基本上,这个类存储播放列表集合和当前播放轨道的索引。最后,我已经创造了WPF UI窗口:

<Window ...> 
... 
<ListBox 
    Name="PlaylistListBox" 
    ItemsSource="{Binding Source={StaticResource ResourceKey=PlaylistViewSource}}" 
    ItemTemplateSelector="{Binding Source={StaticResource ResourceKey=TrackTemplateSelector}}" 
    MouseDoubleClick="PlaylistListBox_MouseDoubleClick" /> 
... 
</Window> 

背后相应的代码:

... 
private void PlaylistListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    int index = this.PlaylistListBox.SelectedIndex; 
    this.windowController.NowPlayingTrackIndex = index; 
} 
... 

项目源点,其中CollectionViewSource定义静态资源。 ItemTemplateSelector根据轨道状态(NowPlaying或Played)定义哪个DataTemplate用于列表框项目。

当用户双击播放列表项目时,MainWindowController中的NowPlayingTrackIndex被更新并更新轨道状态。问题是,列表框项目的DataTemplates不会在窗口上更新,即双击列表框项目不会更改数据模板。为什么?

我试着将PropertyChanged设置为跟踪状态,但没有帮助。我错过了什么?谢谢。

回答

0

代码中有两个问题需要解决。

首先,你应该知道ObservableCollection通知它的观察者关于它自己元素的改变,它不知道或关心其元素属性的改变。换句话说,它不会监视其集合中项目的属性更改通知。因此,更改PlayList集合中的Track对象属性值没有任何意义。这里是关于这个主题的article

其次,您的MainWindowController根本不会广播NowPlayingTrackIndex属性值更改。您应该致电NotifyPropertyChanged("NowPlayingTrackIndex")通知有趣的当事人关于当前播放曲目的变化。这可以解决你的问题,但更优雅的方式,我的建议,将实现一个自定义的ObservableCollection类(如TrackObservableCollection),其中包含NowPlaying属性,而不是在MainWindowController类中实现它看起来像一个不必要的媒介。

+0

谢谢你的回答。我明白为什么我的代码不起作用。但是,我很难实现我自己的'ObservableCollection'类扩展。你能提供一个例子吗?现在是一门精确的课程(当然会觉得这很棒),但只是为了理解如何实现'Track'和'NowPlaying'属性。你可以发布一个新的答案或者编辑这个答案。再次感谢您的回答。干杯。 – Boris 2011-03-02 23:37:23

+0

找到它了:http://stackoverflow.com/questions/1427471/c-observablecollection-not-noticing-when-item-in-it-changes-even-with-inotifyp – Boris 2011-03-03 16:16:10