2012-02-16 2 views
0

포함 된 ContentControl에 특정 뷰를 "삽입"하는 일반 뷰가 있습니다 (이 도움말에서 생성 된 기능 ->help 1 - help 2).ViewModel에 뷰의 일반 개체 알리기

내 플레이의 기본 소스는 다음과 같습니다

MyGenericView.xaml

<UserControl x:Class="MyNS.MyGenericView" 
      ... > 
    <UserControl.Resources> 
     <vml:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
    </UserControl.Resources> 
    <Grid DataContext="{Binding MyGenericViewModel, Source={StaticResource Locator}}"> 
     <ContentControl Content="{Binding MyObject}" /> 
    </Grid> 
</UserControl> 

CustomerView.xaml

<UserControl x:Class="AnotherNS.CustomerView" 
      ... > 
    <Grid> 
     <StackPanel Orientation="Vertical"> 
      <Label Content="Description" /> 
      <TextBox Text="{Binding description}" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Crud.xaml : 나는에 사용하는 리소스 사전에 정확한보기 무엇을 "해결" 표시, DataTypeMyObject 개체에 따라 일반보기에서 제공됩니다.

<ResourceDictionary ... > 
    <DataTemplate DataType="{x:Type mo:Customer}"> 
     <vw:CustomerView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type mo:Product}"> 
     <vw:ProductView /> 
    </DataTemplate> 
    ... 
</ResourceDictionary> 

괜찮습니다. 나는 특정보기 (고객, 제품 등)를 통해 MyObject을 관리 할 수 ​​있습니다.

음. 그게 내 문제 야.

모든 특정보기에는 고유 한 ViewModels이 있으며 물론 각보기의 데이터를 관리합니다. 하지만 일반 뷰는 viewmodel이 아닌 특정 뷰에 제공하기 때문에 (뷰 모델에서) 내가 작업하고있는 객체 (MyObject)가 무엇인지 알지 못합니다.

특정보기의 ViewModels에서보기를 "명령하는"개체를 알 수있는 방법이 있습니까?

답변

1

MVVM Light에서는 "호스팅 된"컨트롤의 "호스팅"컨트롤에 대한 하드 참조없이 "호스팅"보기 모델과 통신 할 수있는 게시자/구독자 스타일의 브로드 캐스트 메시지를 보냅니다. .

이렇게하면 "호스팅 된"컨트롤이 "호스팅"컨트롤에서 분리 된 상태를 유지하면서 두 컨트롤간에 통신 할 수 있습니다.

편집 : MVVM 빛에서

당신을위한 많은 세부 사항을 담당 메신저 객체가있다. 서로 다른 메시지와 메시지를 구분하여 보내는 메시지 클래스를 만들 수 있습니다. 또한 "토큰"을 특정 문자열 만 지정할 수도 있습니다 (여러 가지 "토큰"을 수용 할 수 있도록 클래스에 상수 세트를 설치합니다). 그러면 해당 메시지의 하위 그룹과 해당 토큰이 메시지를받을 수 있습니다. MVVM Light v3의 MVVM Light에서 사용하는 코드 샘플을 아래에 포함 시켰습니다. 약한 이벤트 패턴을 사용하지 않기 때문에 메시지에서 등록을 취소해야합니다.

MVVM Light를 사용하지 않으려면 게시자/구독자 모델에서 동일한 아이디어를 사용할 수 있습니다. 게시자가 보낸 토큰이 구독자 인 토큰인지 확인하는 작업 만 수행하면됩니다. 찾는 자신 만의

public static class DescriptiveMessageName 
{ 
public static void Send(object args) 
{ 
    Messenger.Default.Send(args, "SpecificToken"); 
} 

public static void Send(object args, string token) 
{ 
    Messenger.Default.Send(args, token); 
} 

public static void Register(object recipient, Action<object> action) 
{ 
    Messenger.Default.Register(recipient, 
       "SpecificToken", action); 
} 

public static void Register(object recipient, string token, Action<object> action) 
{ 
    Messenger.Default.Register(recipient, 
       token, action); 
} 

public static void UnRegister(object recipient) 
{ 
    Messenger.Default.Unregister<object>(recipient); 
} 

public static void UnRegister(object recipient, Action<object> action) 
{ 
    Messenger.Default.Unregister<object>(recipient, action); 
} 

}

나는 이미 "게시자/가입자"방법을 사용하는 방법에 대한 생각했다
+0

. 어떤 인스턴스가 올바른 객체인지에 대해 다른 인스턴스가 혼동하지 않을까요? 응답을 업데이트 할 수 있습니까? 고마워. –

+0

음. 내 프로젝트에서 이미 MVVMLight를 사용하고 있습니다. 내가 제공하는 "메신저 개체"를 사용하려고합니다. 감사. –