2010-01-26 4 views
1

이 Model-ViewModel 구현이 올바른 것으로 생각하십니까? Stars (VM에서)는 ObservableCollection of VM 중 다른 ObservableCollection이며, Stars에서 요소를 제거 할 때 모델을 수동으로 삭제해야하기 때문에 VM을 M에서 분리하는 것처럼 느낍니다.MVVM의 계층 적 데이터 문제

OnCollectionChanged를 사용하지 않고이를 개선하는 방법에 대한 아이디어가 있으십니까? 미리 감사드립니다.

모델 :

public class Galaxy 
{ 
    public Galaxy(string name, IList<Star> stars) 
    { 
     Name = name; 
     Stars = stars; 
    } 
    public string Name { get; set; } 
    public IList<Star> Stars { get; set; } 
} 

public class Star 
{ 
    public Star(string name) 
    { 
     Name = name; 
    } 
    public string Name { get; set; } 
} 

ViewModels :

public class GalaxyVM : ViewModelBase 
{ 
    private Galaxy _galaxy; 
    private ObservableCollection<StarVM> _stars; 

    public GalaxyVM(Galaxy galaxy) 
    { 
     _galaxy = galaxy; 
     _stars = new ObservableCollection<StarVM>(from sys in _galaxy.Stars 
                select new StarVM(sys)); 
    } 

    public string Name 
    { 
     get { return _galaxy.Name; } 
    } 
    public ObservableCollection<StarVM> Stars 
    { 
     get { return _stars; } 
    } 
} 

public class StarVM : ViewModelBase 
{ 
    private Star _star; 
    public StarVM(Star star) 
    { 
     _star = star; 
    } 
    public string Name 
    { 
     get { return _star.Name; } 
    } 
} 
+0

OnCollectionChanged를 구현하지 않으려면 왜 ObservableCollection을 사용하고 있습니까? –

+0

업데이트 할 UI가 필요하기 때문에 Model과 ViewModel을 동기화하는 데 사용하고 싶지 않습니다. – Natxo

답변

1

음, 거기 디커플링 그리고 디커플링이있다.

보기의 구현 세부 사항에 대해 알지 못하는 모델을 갖는 것이 한 가지입니다. 좋습니다.

동적 뷰에서 사용할 수없는 모델을 갖는 것도 또 다른 문제입니다. 모델 클래스가 변경 알림을 구현하지 않으면 UI를 모델 상태와 안정적으로 유지하는 것이 어려워 질 것입니다. 당신은 모든 것을 뷰 클래스에 넣음으로써 변경 알림을 시도하고 위장 할 수 있지만, 하루가 끝날 때 모델의 상태를 직접 변경하는 코드가있을 것이며, 변경 알림을 구현하지 않으면 뷰 그것에 대해 알지 못하고 UI가 동기화되지 않습니다.

공용 설정자 인 IList<Star> 속성을 Galaxy에 구현하지 않았을 수 있습니다. StarList 유형의 Stars 속성을 만들고 IList<Star>을 구현 한 StarList 클래스를 만듭니다. 그렇지 않은 경우를 제외하고는.

+0

고마워 로버트, 다음 ObservableCollection 모델을 구현하는 의미가 될 것 같아 다른 누군가가 그것을 변경하면 viewmodel 알리기. 내가 맞습니까? BTW 나는 당신이 제안한 변화에 대한 요점을 보지 못한다. 내게 부탁한다. – Natxo

+0

'IList '의 공개 설정자는'Galaxy' 클래스의 인스턴스를 생성하는 것이 어떤 종류의 목록을 들어갈 것입니다. 그것은 그것이 목록 일 때 당신이 그것에 대해 신경 쓰지 않는다는 잘못된 인상을 불러옵니다. 사실 UI가 작동 할 수 있도록 변경 알림을 구현해야 할 수도 있습니다. –

관련 문제