2013-03-12 6 views
2

Mvvm Light Devotees는 다음 상황을 어떻게 처리합니까? "자식"ViewModel의 인스턴스를 사용하는 여러 "Master"ViewModel이 있습니다. 즉Mvvm Light ViewModel with ViewModel

하위보기 - 주문의 광고 항목 목록에 대한 하위 모델 ViewModel - "OrderLineItemListViewModel".

상위 ViewModel - 주문의 뷰 모델 "OrderDetailViewModel". 상위 VIewModel - 주문을 청구하기위한 뷰 모델 "OrderChargeViewModel".

상위 ViewModel에는 모두 OrderLineItems 목록이 있어야하며 둘 다 동시에 열 수 있습니다. 현재 부모 ViewModel에 하위 ViewModel 유형의 속성이 포함되어 있으며이를 참조 할 수 있도록 설정했습니다.

public class ChildViewModel 
{ 
    public ChildViewModel() 
    { 
     Items = new ObservableCollection<ListItemViewModel> 
        { 
         new ListItemViewModel("One"), 
         new ListItemViewMOdel("Two") 
        } 
    } 

    public ObservableCollection<ListItemViewModel> Items {get; private set;} 
} 

public class ParentViewModel 
{ 
    public ParentViewModel() 
    { 
     ChildViewModel = new ChildViewModel(); 
    } 

    public ChildViewModel ChildViewModel {get; set;} 
} 

<Window> 
    <DataGrid ItemsSource={Binding ChildViewModel.Items} /> 
</Window> 

지금, 나는 그러나 내가 그렇게 할 수있는 청소 방법을 알아 내지 못했다는 ViewModelLocator 및 메시징과 함께 할 수있는 방법이 있어야한다 생각합니다. 나는 ViewModel의 non-singleton 인스턴스를 생성하기 위해 ViewModelLocator를 사용하는 방법을 알고있다. 그러나, 내가 알아낼 수없는 것은 자식 ViewModel 메시지에 부모 ViewModel이 응답하도록하는 방법이며, 메시지가 "자식"ViewModel에서 온 것이므로 반드시 조치를 취해야합니다.

누구든지이 문제를 해결하는 방법에 대해 조언을 구하거나, 제가 지금까지 그대로 계속해야합니까? 생각하고있는 가장 큰 부분은 당장입니다. ViewModelLocator를 선택적으로 사용하고 궁극적으로 직관적인지 확실하지 않습니다.

답변

1

이 총계가 귀하의 질문에 답할지는 확실하지 않지만 귀하의 질문과 같이 중첩 된보기 모델은 무엇입니까? 부모보기/viewmodel있는 컬렉션 (이 경우 엔티티 프레임 워크 탐색 속성) 자식보기/viewmodel 함께 ineract 원하는. 그렇게하면 메시징없이 "상호 작용"이 가능합니다.

예를 들어 자식 뷰 모델에서 부모 컬렉션을 콤보 상자에 바인딩하려면이 방법을 사용합니다 (부모 뷰와 자식 뷰는 사용자 정의 컨트롤이며 부모 뷰에서는 컨텐트 컨트롤 하위 뷰/뷰 모델에 바인딩 됨) :

<UserControl x:Class="EmployeeListView" 
      DataContext="{Binding EmployeeList_VM, Source={StaticResource Locator}}"/> 
    <ContentControl Name="DetailControl" DataContext="{Binding Path=Selection, Mode=TwoWay}" > 
     <ComboBox Name="cbStatus" 
      ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeStatus}" 
      SelectedItem="{Binding ElementName=DetailControl, Path=DataContext.employee_status}" 
      SelectedValuePath="idStatus" 
      SelectedValue="{Binding idStatus, Mode=TwoWay, ValidatesOnDataErrors=True}" 
      DisplayMemberPath="chrCode"/> 
    </ContentControl> 
</UserControl> 

가능한 한 간단하게 만들려고했습니다. 내가 조인 할 컬렉션 (EmployeeStatus)이 들어있는 조상 usercontrol datacontext에 대한 itemsource 바인딩을 주목하십시오. 이렇게하면 하위 뷰 모델이 메시징을 사용하지 않고 상위 VM 컬렉션/객체와 상호 작용할 수 있습니다. 그렇지 않으면 당신이 찾고있는 특정 메시징을 대상으로 메시징을 사용했지만 위의 코드가 더 간단하다고 생각합니다.

편집 : 귀하의 코멘트에 대한 응답으로 , 나는 여기 도전은 당신이 당신의 부모/자식 viewmodels을 분리 할 생각하지만 동시에 당신이 사람이 "짝"하는 말할 수 있어야합니다. 그래서 이럴 방법은 부모/자식보기 모델에서 일치하는 속성을 가진 플래그/식별자의 일부 유형을 만드는 것입니다. 부모 viewmodel의 conrtuctor에이 속성을 설정하고 생성자에서이 식별자를 받아들이고 해당 속성을 설정하는 자식 viewmodel의 두 번째 생성자를 갖습니다. 그런 다음 메신저를 사용하여 부모의 뷰 모델 유형을 타겟팅하고 식별자를 메시지의 매개 변수로 전달합니다. 그런 다음 상위보기 모델에 메신저를 등록하여 "유형"을 대상으로하는 메시지를 "청취"하고 식별자 플래그/매개 변수가 상위 뷰 모델의 매개 변수와 일치하는지 확인합니다.

하위 뷰 모델에 대해 두 개의 생성자를 사용하면 다른 위치에서 하위 뷰 모델을 계속 사용하고 상위 뷰 모델의 속성 유형에 직접 종속성을 재현 할 수 없기 때문에 하위 뷰 모델을 함께 연결하지 않아도됩니다.

나는 이것이 의미가 있기를 바랍니다. 당신은 당신이 메신저에 익숙하다고 말했기 때문에 타입을 목표로하고 메시지에 매개 변수를 추가하는 방법의 예제를 게시하지 않았지만, 원한다면 할 수 있습니다.

희망이 도움이됩니다.

+0

제목에서 말한 것처럼 Mvvm Light를 사용하고 있습니다. 귀하의 의견을 보내 주셔서 감사 드리며, 같은 상황을 처리하고 있다고 생각하지 않습니다. 나는 메시징을 사용하는 것을 피하려고하지 않고있다. 나는 그것을 사용하려고 노력하고있다. ViewModelLocator를 사용하여 상위 뷰와 하위 뷰 모델을 모두 생성하는 방법을 알아야합니다 (현재는 부모 만 생성 한 다음 상위 뷰는 수동으로 하위 뷰를 만듭니다). 부모가 아이의 메시지가 * 자식 (또는 그 반대로) 그렇게 행동 할 수 있습니다. –

+0

메신저를 왜 사용 하시겠습니까? 그것은 정확히 무엇을 성취합니까? 나는 메신저를 가능한 한 적게 사용하는 것이 낫다는 것을 발견했으며, 종종 더 나은 해결책이 있습니다. 프레임 워크 질문에 대해 유감스럽게 읽지 않았습니다. –

+0

저는 관리자를 사용하여 내 뷰 모델을 서로 완벽하게 분리 할 수 ​​있으며 뷰 모델 검색 기능을보다 완벽하게 활용할 수 있습니다. –