我创建了一个类田径代表在播放列表中的歌曲:数据绑定列表框将不会更新
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
设置为跟踪状态,但没有帮助。我错过了什么?谢谢。
谢谢你的回答。我明白为什么我的代码不起作用。但是,我很难实现我自己的'ObservableCollection'类扩展。你能提供一个例子吗?现在是一门精确的课程(当然会觉得这很棒),但只是为了理解如何实现'Track'和'NowPlaying'属性。你可以发布一个新的答案或者编辑这个答案。再次感谢您的回答。干杯。 – Boris 2011-03-02 23:37:23
找到它了:http://stackoverflow.com/questions/1427471/c-observablecollection-not-noticing-when-item-in-it-changes-even-with-inotifyp – Boris 2011-03-03 16:16:10