【发布时间】:2014-12-02 06:28:49
【问题描述】:
我已经阅读了一些针对此问题的有关 stackoverflow 的问题,但没有发现真正提供如何正确执行此操作的方法。我只是对我的实施感觉不对。
鉴于以下情况: 我有一个包含曲目的播放列表(例如音乐播放列表)。
class PlaylistModel-> string Name // Name of the playlist-> List<TrackModel> Tracks // tracks contained by the playlist
class TrackModel-> string Name
鉴于此方案,如果我的 ViewModel 将播放列表和关联曲目显示为可能在用户交互期间更改的 TreeView,我将如何映射此关系?
我已经考虑过这种关系并最终使用了这样的东西:
public class PlaylistViewModel : ViewModelBase
{
private PlaylistModel _Playlist;
public PlaylistModel Playlist
{
get { return _Playlist; }
set
{
if (_Playlist == value) return;
_Playlist = value;
NotifyOfPropertyChange(() => Playlist);
}
}
public ObservableCollection<TrackViewModel> Tracks
{
get { return new ObservableCollection<TrackViewModel>(Playlist.Tracks.Select(track => new TrackViewModel(track))); }
set
{
var tracksCollection = new ObservableCollection<TrackViewModel>(Playlist.Tracks.Select(track => new TrackViewModel(track)));
if (tracksCollection == value) return;
Playlist.Tracks = new List<TrackModel>(value.Select(trackViewModel => trackViewModel.Track));
NotifyOfPropertyChange(() => Tracks);
}
}
public string Name
{
get { return Playlist.Name; }
set
{
if (Playlist.Name == value) return;
Playlist.Name = value;
NotifyOfPropertyChange(() => Name);
}
}
}
(仅包含基本代码部分)
您可能已经注意到 _Playlist.Tracks 属性的类型转换为 TrackModel。这就是这里的问题。我本可以在 TrackModel 类中实现 INotifyPropertyChanged,但我对这个也感觉不对,因为它根本不是我的 UI 交互层。
【问题讨论】: