【问题标题】:MVVM - Relation between ModelsMVVM - 模型之间的关系
【发布时间】: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 交互层。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    有关在模型、视图模型或两者中实现 INotifyPropertyChanged 的​​信息,请参阅 this discussion

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

    1. 从服务器加载播放列表
    2. 用户修改播放列表
    3. 用户要么保存播放列表,要么放弃更改

    您也可以考虑让您的模型没有 INotifyPropertyChanged 并利用 AutoMapper 从模型转换为视图模型(加载)和视图模型转换为模型(保存)。

    Another post 关于此事。

    【讨论】:

    • 实现 INotifyPropertyChanged 的​​东西实际上是一个 ViewModel,因为唯一真正订阅属性更改通知的是视图绑定。只有一个 ViewModel(没有模型)的应用程序不一定有什么问题——“模型”可以是内置类型,如集合等。如果你发现你需要添加很多非视图特定的逻辑上,最好把模型和视图模型分开。
    • 您好,感谢您的回答。在讨论中偶然发现这条评论:What do you do if a property changes in the model? You need to get it to the view-model somehow. Honest question, I'm dealing with this conundrum right now. 根据投票,这似乎很常用?基本上这就是我在这个确切的例子中所面临的。
    • @PeterRitchie 如果我有一个类,它代表我域中的一个实体,填充了从数据库接收到的数据,并包含作用于该数据的业务逻辑,该类是一个模型。如果它然后实现 INotifyPropertyChanged 它仍然是一个模型。如果同一个类然后直接绑定到视图的DataContext,那么我相信它是一个模型和一个视图模型。
    • @JasonFry 我不同意,因为绑定是视图问题,而不是模型问题。请记住,模型应该独立于视图,并且不应该依赖于任何与视图相关的内容。它处于较低级别,不应承担高于它的依赖项。
    • @PeterRitchie 我们都同意将模型与视图的关注点分开是首选(请参阅我的原始答案),但实现 INotifyPropertyChanged 的​​模型不一定依赖于视图。毕竟,INotifyPropertyChanged 用在 WPF 视图/视图模型以外的地方。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多