2013-03-28 1 views
2

간단한 질문이며 성공없이 몇 시간 동안 인터넷을 검색했습니다 ...MVVM에서 모델을 동기화하고 양방향 모델을 보는 방법은 무엇입니까?

하나의 속성이있는 모델과보기 모델이 있습니다. 뷰에서이 속성을 볼 수 있도록하기 위해 모델 객체에서 자동으로 생성되어야하는 뷰 모델 객체를 사용하고 그 반대의 경우도 마찬가지입니다. 물론 모델에서 모델 객체를 업데이트하면 뷰 모델에서 뷰 모델 객체가 업데이트되고 이로 인해 모델에서 모델 객체가 업데이트되기 때문에 다음 코드는 StackOverflowException을 throw합니다. 등등 ...

class ModelObject 
{ 
    ... 
} 

class ViewModelObject 
{ 
    ... 
} 

class Model : INotifyPropertyChanged 
{ 
    private ModelObject modelObject = new ModelObject(); 

    ... 

    public ModelObject ModelObject 
    { 
    get 
    { 
     return this.modelObject; 
    } 
    set 
    { 
     this.modelObject = value; 
     this.NotifyPropertyChanged("ModelObject"); 
    } 
    } 
} 

class ViewModel : INotifyPropertyChanged 
{ 
    private ViewModelObject viewModelObject = new ViewModelObject(); 
    private Model model = new Model(); 

    ... 

    public ViewModel() 
    { 
    this.model.PropertyChanged += new PropertyChangedEventHandler(this.propertyChangedEvent); 
    } 

    public ViewModelObject ViewModelObject 
    { 
    get 
    { 
     return this.viewModelObject; 
    } 
    set 
    { 
     this.viewModelObject = value; 
     this.model.ModelObject = new ModelObject(...); 
     this.NotifyPropertyChanged("ViewModelObject"); 
    } 
    } 

    private void propertyChangedEvent(object sender, PropertyChangedEventArgs e) 
    { 
    if (e.PropertyName.Equals("ModelObject")) 
    { 
     this.ViewModelObject = new ViewModelObject(...); 
    } 
    } 
} 

이러한 두 개체를 동기화하는 일반적인 방법은 무엇입니까?

+0

이 동작의 응용 프로그램은 무엇입니까? 어디에서 사용합니까? 너 뭐하려고? – Floremin

+0

MVVM에서 뷰 모델과 모델을 동기화하는 것이 기본이라고 생각합니다. 다른 경우에는이 동작이 영구적으로 필요합니다. – user2220511

답변

4

은색 총알이 없습니다. 모델은 데이터베이스의 표현이며 뷰 모델은 인터페이스에 더 가깝기 때문에 모델을 뷰 모델로 변환하거나 그 반대로 모델을 변환하는 데 필요한 비즈니스 로직이 항상 있습니다. SyncModel(ViewModel viewModel)SyncViewModel(Model model)

하나 개 더 제안 - -

모델에서 INotifyPropertyChanged를 구현하지 말아야

나는 일반적으로 두 내보기 모델 클래스의 메소드가 있습니다. 뷰 모델은이를 사용자 인터페이스에 바인딩 된 것으로 구현해야합니다. 왜 모델을 변경해야합니까? 그것은 db에서 whats를 나타냅니다. 새로 고침 할 수는 있지만 모델에 대한 변경 알림이 필요한 이유는 무엇입니까?

편집 : MVVM: Binding to Model while keeping Model in sync with a server version

하드 참조. 다른 클래스에 대한 참조가있는 각 클래스는 속성 변경 이벤트를 수신하여 그에 따라 업데이트합니다.

관찰자 패턴 - 각 관찰자가 관찰자와 함께 등록하면 관찰자는 모든 변경 사항을 수신하고 모든 가입자를 업데이트합니다.

유용 할 수도있는 event aggregator이 있습니다.

지연된 업데이트를 원하면 isDirty 속성이 필요합니다. 당신은 귀하의 응용 프로그램을 잘 알고, 더 많은 기사를 구글에 가서 현명하게 선택하십시오.

+1

이 예제의 모델은 데이터베이스를 나타내지 않으며 메모리의 단순한 모델입니다. 예를 들어, 다른 뷰 모델을 통해 모델을 변경할 수도 있으며, 위의 뷰 모델은 인터페이스를 새로 고치는 INotifyPropertyChanged-Event를 발생시키는 이벤트에 대해 알려야합니다. – user2220511

+0

내 편집을 확인하고 링크와 일부 텍스트로 업데이트되었습니다. –

+0

답장을 보내 주셔서 감사합니다. 나는 그 방법으로 그것을 시도 할 것이다! – user2220511