【发布时间】:2011-03-01 05:04:25
【问题描述】:
我创建了一个类 Track,它代表播放列表中的一首歌曲:
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;
}
接下来我创建了在 UI 窗口和 Track 类之间交互的 MainWindowController 类:
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;
}
...
Items 源指向定义CollectionViewSource 的静态资源。 ItemTemplateSelector 定义根据轨道状态(NowPlaying 或 Played)将哪个 DataTemplate 用于列表框项。
当用户双击播放列表项时,MainWindowController 中的NowPlayingTrackIndex 会更新并更新轨道状态。问题是,列表框项目的DataTemplates 不会在窗口上更新,即双击的列表框项目不会更改数据模板。为什么?
我尝试将PropertyChanged 设置为跟踪状态,但没有帮助。我错过了什么?谢谢你。
【问题讨论】: