MVVM - 模型之间的关系

时间:2014-10-07 18:21:07

标签: c# wpf mvvm

我已经阅读了针对此问题的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交互层。

1 个答案:

答案 0 :(得分:2)

请参阅this discussion在模型,视图模型或两者中实现INotifyPropertyChanged。

如果您的工作流程符合以下

  1. 从服务器加载播放列表
  2. 用户修改播放列表
  3. 用户保存播放列表或放弃更改
  4. 你也可以考虑保持你的模型没有INotifyPropertyChanged,并利用AutoMapper从模型转换为viewmodel(加载),将viewmodel转换为模型(保存)。

    Another post就此事。

相关问题