2014-04-22 3 views
14

내 Windows Phone 8 앱에는 항목 목록이 있습니다. 목록 항목에 대해 ItemTemplate을 정의했습니다.datacontext (items of out of items)

각 항목에보기 모델의 값 하나만 표시하고 목록 항목 자체는 표시하지 않습니다. 목록 항목에서 viewmodel으로 바인딩을 어떻게 설정해야합니까?

내 데이터 템플릿은 다음과 같이이다 :

<DataTemplate x:Key="template"> 
    <StackPanel> 
     <TextBlock Text="{Binding Name}"/> <!-- From list item --> 
     <TextBlock Text="{Binding MyViewModel.Country ?? }"/> <!-- From view model --> 
    </StackPanel> 
</DataTemplate> 

그래서 (항목 소스) 항목을 나열 모델을하지 볼 나라 속성을 바인딩하는 방법.

답변

36

WPF으로 질문 태그를 추가 했으므로 WPF에서이를 수행하는 방법을 알려줄 수 있습니다. Windows Phone 8 앱에서 다시 사용할 수 있는지 확인할 수 있습니다.

먼저, 당신은 x:Name이 요소가있는 뷰 모델이 바인딩되는 뿌리 제공 할 수 있습니다. 그것은 윈도우라고 말하고, x : 그것에 이름을 붙이고 ElementName을 사용하여 바인드하십시오. 둘째


<Window x:Name="myWindow"> ... <DataTemplate x:Key="template"> <StackPanel> <TextBlock Text="{Binding Name}"/> <!-- From list item --> <TextBlock Text="{Binding DataContext.MyViewModel.Country, ElementName=myWindow }"/> <!-- From view model --> </StackPanel> </DataTemplate> </Window> 

, 당신은 루트 요소의 DataContext를 비주얼 트리를 여행 얻을 RelativeSource 사용해 볼 수 있습니다.

<DataTemplate x:Key="template"> 
    <StackPanel> 
     <TextBlock Text="{Binding Name}"/> <!-- From list item --> 
     <TextBlock Text="{Binding DataContext.MyViewModel.Country, 
          RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType=Window} }"/> 
         <!-- From view model --> 
    </StackPanel> 
</DataTemplate> 

목록 상자가 루트 요소에서의 DataContext를 상속하는 경우 Moreove, (즉, 사용자가 명시 적으로리스트 박스에 DataContext를 설정하지 않은 경우). ListBox뿐만 아니라 Window 대신 두 가지 방법을 모두 사용할 수 있습니다.

-here을 언급 한 바와 같이, FindAncestor가 윈도우 폰 8에 대한 정의되어 있지만 요소 이름이 작업을 수행하지 않습니다. 그래서, 첫 번째 접근 방식을 사용해보십시오 그리고 그것은 당신을 위해 일해야합니다.

+2

고마워요. Rohit! 메신저 caliburn 마이크로를 사용하고 그것은보기 모델을 지정하지 않고 바인딩 작업을 할 것으로 보인다. 그래서이 하나는 나를 위해 작동합니다. {DataContext.Country, ElementName = myWindow 바인딩} – devha

+3

ElementName은 템플릿을 재사용 할 수 없게 만들고 FindAncestor는 WinRT/Windows Store 앱에 존재하지 않습니다. Windows Store 앱에서 상위 컨텍스트를 바인딩하는 방법 – Tseng