이 문제를 대상으로하는 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 인터랙션 레이어가 아니기 때문에 이것에 대해별로 느끼지 않는다.
실제로 속성 변경 알림을 구독하는 유일한 것은보기 바인딩이기 때문에 INotifyPropertyChanged를 구현하는 것은 실제로 ViewModel입니다. ViewModel (모델이없는)이있는 앱에는 반드시 문제가있는 것은 아닙니다. '모델'은 컬렉션과 같은 내장 유형이 될 수 있습니다.보기 이외의 많은 항목을 추가해야하는 경우 논리를 사용하면 모델을 뷰 모델과 분리하는 것이 좋습니다. –
안녕하세요, 답변 해 주셔서 감사합니다. 토론에서이 논평을 우연히 발견했습니다. '모델에서 속성이 변경되면 어떻게합니까? 어떻게 든 뷰 모델을 가져와야합니다. 정직한 질문, 나는 지금이 수수께끼를 다루고있다. "득표에 따르면, 이것은 일반적으로 사용되는 것 같다? 기본적으로 이것은 내가 정확한 예에서 직면 한 것입니다. – 0x8BADF00D
@PeterRitchie 도메인의 엔티티를 나타내는 클래스가 데이터베이스에서 수신 된 데이터로 채워지고 클래스가 모델 인 해당 데이터에서 작동하는 비즈니스 로직을 포함하는 경우. 그런 다음 INotifyPropertyChanged를 구현하면 여전히 모델입니다.그런 다음 동일한 클래스가 뷰의 DataContext에 직접 연결되어 있으면 모델 및 뷰 모델이라고 생각합니다. –