我已经阅读了针对此问题的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交互层。
答案 0 :(得分:2)
请参阅this discussion在模型,视图模型或两者中实现INotifyPropertyChanged。
如果您的工作流程符合以下
你也可以考虑保持你的模型没有INotifyPropertyChanged,并利用AutoMapper从模型转换为viewmodel(加载),将viewmodel转换为模型(保存)。
Another post就此事。