2014-10-07 6 views
2

이 문제를 대상으로하는 stackoverflow에 대한 몇 가지 질문을 읽었지만 올바르게 수행하는 방법이 없습니다. 나는 단지 내 구현에 대해 옳다고 생각하지 않는다.MVVM - 모델 간의 관계

다음 상황을 고려하십시오. 트랙이 들어있는 재생 목록 (예 : 음악 재생 목록)이 있습니다. 내 ViewModel을 사용자 동안 변경 될 수있는 트 리뷰로 재생 목록 및 관련 트랙을 보인다면 나는이 관계를 매핑 얼마나

class TrackModel이 계획을 감안할 때
-> string Name

class PlaylistModel
-> string Name // Name of the playlist
-> List<TrackModel> Tracks // tracks contained by the playlist, 상호 작용?

는 이미 관계에 대해 생각이 같은 것을 사용하여 종료 :

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 인터랙션 레이어가 아니기 때문에 이것에 대해별로 느끼지 않는다.

답변

2

모델, viewmodel 또는 둘 다에서 INotifyPropertyChanged를 구현하는 경우 this discussion을 참조하십시오. 당신은 서버에서 다음

  1. 로드 재생 목록과 일치하는 흐름이있는 경우

  2. 사용자가 재생 목록을
  3. 사용자를 수정하거나 재생 목록을 저장하거나 폐기는

당신은 또한 고려할 수 변경 모델을 유지하면 INotifyPropertyChanged가 적용되지 않고 AutoMapper을 사용하여 모델에서 viewmodel (로드) 및 viewmodel을 모델 (저장)로 변환 할 수 있습니다.

Another post

+0

실제로 속성 변경 알림을 구독하는 유일한 것은보기 바인딩이기 때문에 INotifyPropertyChanged를 구현하는 것은 실제로 ViewModel입니다. ViewModel (모델이없는)이있는 앱에는 반드시 문제가있는 것은 아닙니다. '모델'은 컬렉션과 같은 내장 유형이 될 수 있습니다.보기 이외의 많은 항목을 추가해야하는 경우 논리를 사용하면 모델을 뷰 모델과 분리하는 것이 좋습니다. –

+0

안녕하세요, 답변 해 주셔서 감사합니다. 토론에서이 논평을 우연히 발견했습니다. '모델에서 속성이 변경되면 어떻게합니까? 어떻게 든 뷰 모델을 가져와야합니다. 정직한 질문, 나는 지금이 수수께끼를 다루고있다. "득표에 따르면, 이것은 일반적으로 사용되는 것 같다? 기본적으로 이것은 내가 정확한 예에서 직면 한 것입니다. – 0x8BADF00D

+0

@PeterRitchie 도메인의 엔티티를 나타내는 클래스가 데이터베이스에서 수신 된 데이터로 채워지고 클래스가 모델 인 해당 데이터에서 작동하는 비즈니스 로직을 포함하는 경우. 그런 다음 INotifyPropertyChanged를 구현하면 여전히 모델입니다.그런 다음 동일한 클래스가 뷰의 DataContext에 직접 연결되어 있으면 모델 및 뷰 모델이라고 생각합니다. –

관련 문제