2011-01-11 6 views
5

alt text컬렉션 내에서 MVVM 상위 뷰 모델에 액세스하십시오.

위 그림은 내 프로그램을 보여줍니다. 화살표는 Binding을 나타냅니다.

내 MainWindow.xaml의 데이터 액세스 문자가 MainVM으로 설정되어 있습니다.

이 창에는 ObservableCollection (ViewModel)에 바인드 된 탭 컨트롤이 있습니다. 탭 컨트롤은 데이터 템플릿을 사용하여 ViewModel에 해당하는 뷰를 표시합니다.

ObservableCollectionMainVM에 있습니다.

MainVM에있는 속성은 ObservableCollection에 포함 된 ViewModel에서 어떻게 액세스합니까?

내 프로그래밍 모델의 수정이 필요한 답변을 제공합니다.

답변

6

켄트 (Kent)의 말에 달려있다. . .

아키텍처 관점에서 ViewModel 클래스는 MainVM에 대해 알 필요가 없습니다. 그것이 알 필요가있는 것은 ViewModel의 인스턴스로 전달되어 원자 상태를 유지하고 호출하는 것에 대해 걱정할 필요가 없도록해야합니다. 솔리드 (SOLID) 관점에서 볼 때 이것은 의존성 반전 원리입니다.

ViewModel 내에서 액세스해야하는 MainVM의 모든 속성은 ViewModel의 인스턴스 구성의 일부로 전달되어야합니다. 개인적으로, 나는 그들을 생성자에 포함시키는 팬이지만 속성으로도 노출 할 수 있습니다.

오버 킬 방법 (권장하지 않음)은 생성자를 설정하여 MainVM의 인스턴스를 가져 와서 생성자에 this을 전달합니다. 예컨대 :

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

을 다음 방금 할 수 ViewModel을 만들 때 :

ViewModel vm = new ViewModel(this); 
+1

내가 종속성 반전 원리 작동하도록 내 프로그램을 변경합니다.이제 속성이 포함 된 MainVM 대신 내 ViewModel이 속성을 포함하며 MainVM을 통해 동기화 상태로 유지됩니다. –

+0

왜 과장인가요? 나는 원자 VM의 아이디어에 동의하지만 비슷한 종류의 부모 관계는 (DataRow) 행에 있습니다. 테이블 –

2

누가 ViewModel의 인스턴스를 생성합니까? MainVMViewModel 사이에 긴밀한 관계가있는 경우 ViewModel은 해당 생성자에서 MainVM의 인스턴스를 가져야합니다.

다른 대안은 ViewModelMainVM에 액세스 할 필요가없는 다른 디자인을 제안하는 것입니다. 그렇게하면 더 많은 정보와 별도의 질문이 필요합니다.

4

얼마나 많은 상호 작용이 필요한지에 따라 ViewModel 클래스에서 이벤트를 실행하고 MainVM에서 해당 이벤트를 처리하고 그에 따라 개별 ViewModel의 속성을 설정하여 다른 방법으로 갈 수 있습니다. 당신이 (내가 MainVM 어디?에서 수행된다고 가정) 뷰 모델 컬렉션을 인스턴스화 할 때

또 다른 옵션이 될 것입니다, 당신은 단지 생성자 매개 변수로 MainVM 전달 및 유지하고 각 ViewModel의 내부 MainVM 인스턴스 수 있습니다.

관련 문제