2011-12-16 4 views
1

Visit라는 비즈니스 개체를 사용하는 WPF 응용 프로그램을 가지고 있는데, 환자, 시험 및 기타와 같은 많은 자식 개체가 있습니다. 이러한 다양한 하위 개체를 편집하기위한보기 및보기 모델이 있으므로 환자 정보를 편집하기위한보기 및보기 모델과 검사 정보 세트 등이 있습니다. 또한 기본 창보기 모델이 있습니다.WPF MVVM OnPropertyChanged 두 ViewModels 통신

새로운 방문을 열어야 할 때 자신의보기 모델이기도 한 검색 화면이 있습니다. 데이터베이스에서 새로운 방문을 열고 모든 다른보기에 방문이 변경되었음을 알릴 필요가 있습니다.

WeakEventManager를 살펴보고 다른 모든 뷰의 부모 인 하나의보기 모델을 가지고 있지만 최선의 방법은 무엇인지 잘 모르겠습니다. 뷰 모델 간의 관계가 무엇인지, 오픈/검색 뷰 모델이 다른 모든 뷰를 업데이트해야하는 방법을 알고 싶습니다. 속성을 업데이트 할 때 내 뷰 모델에서 OnPropertyChanged ("propname")를 호출했지만 다른 뷰는 열기/검색 뷰 모델에 대해 알지 못하기 때문에 OnPropertyChanged ("Visit")

답변

2

Messenger에 대해 이야기하는이 post on SO을 살펴보십시오. 귀하의 경우에는 방문 개체를 게시하고 ViewModel 캡처를 표시합니다. 당신이 Model 데이터가 거의 수정을 많이하지 않고 View에 직접 제공됩니다 매우 데이터 중심의 뷰가있는 경우

당신은 쉽게 ViewModel에 속성으로 Model을 노출하고 해당 속성에 View 바인딩을 가질 수 있습니다.

하나 ViewModel 다른 View 년대는 Model

편집에 프로퍼티 변경 이벤트를 수신 할 필요없이 자동으로 업데이트됩니다 업데이트이 방법 :

내 두 번째 지점을 정교하게하려면 : 당신은 할 수있다 또는 이것을 필요로하지 않을 수도 있지만 ModelINotifyPropertyChanged을 구현하는 경우 해당 모델의 변경 사항은 View으로 자동 전달됩니다.

당신은 당신이 2 amounst 공유 같은 Visit 객체가 필요있을 경우에만 적용 말했듯이 당신이 직접 XAML

public class ViewModel1 : ViewModelBase 
{ 
    public ViewModel1(IMessenger messenger) 
    { 
     messenger.Register<Visit>(this, (v) => CurrentVisit = v); 
    } 

    public Visit CurrentVisit 
    { 
     get { _visit; } 
     set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); } 
    } 
} 

public class ViewModel2: ViewModelBase 
{ 
    public ViewModel2(IMessenger messenger) 
    { 
     messenger.Register<Visit>(this, (v) => CurrentVisit = v); 
    } 

    public Visit CurrentVisit 
    { 
     get { _visit; } 
     set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); } 
    } 
} 

public class CurrentVisit : INotifyPropertyChanged 
{ ... } 

으로 바인드 방문 속성을 가질 수있는 방문 개체와 2 개보기를해야하는 경우 ViewModel s이고 View의 대부분이 데이터 중심이거나 다른 말로하면 Model의 데이터가 화면에 직접 표시됩니다. 이는 ViewModel의 속성을 복제하지 않고 항상 속성 변경 이벤트를 발생시키지 않으려는 것입니다.

+0

그 두 번째. MesageBus 접근 방식은 서로에게 알릴 필요가있는 분리 된 ViewModel이 많은 경우에 실제로 도움이 될 수 있습니다. – lbergnehr

+0

고맙습니다. "이 방법으로 하나의보기가 모델을 업데이트하면 다른보기가 모델의 속성 변경 이벤트를 수신하지 않고도 자동으로 업데이트됩니다"- 정확히 어떻게 작동합니까? 예를 들어 보시거나 조금 정교하게 만드시겠습니까? – bebonham

+0

ViewModel에 CurrentVisit라는 속성이 있고 모든 뷰에서 자동으로 업데이트하는 방법을 변경 한 경우 OnPropertyChanged를 호출해야합니까? 미안해, 이해가 안돼. – bebonham

0

전역 변수를 사용하십시오. 기본 변수 ViewModel 클래스의 전역 변수를 설정하고 그 변수 값을 반환하는 부분을 가져옵니다. 전역 변수를 설정하여 다른 공용 프로젝트에서 클래스를 만들고 정적 공용 변수 또는 속성을 만듭니다.

+0

죄송합니다. 내 viewmodel 클래스의 기반을 의미합니다. – Harish