2014-04-22 13 views
14

W mojej aplikacji Windows Phone 8 mam listę przedmiotów. Zdefiniowałem ItemTemplate dla elementów listy.Powiąż macierzysty datacontext (z zasobów pozycji)

Chcę wyświetlić w każdym z tych elementów jedną wartość z widoku modelu, a nie z samego elementu listy. Jak skonfigurować powiązanie z elementu listy do viewmodel.

Mój szablon danych jest tak:

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

Więc jak powiązać własność kraju, aby zobaczyć model nie Wykaz egzemplarzy (w źródle pozycja).

Odpowiedz

36

Od czasu, gdy oznaczyłeś swoje pytanie numerem WPF, umiem powiedzieć Ci, jak to zrobić w WPF, możesz sprawdzić, czy można go ponownie wykorzystać w aplikacjach Windows Phone 8.

Pierwszy, można dać x:Name do wykorzenienia elementem, który jest ViewModel wiążą się. Powiedzmy, że to okno, zestaw x: Nazwa na nim i powiązanie za pomocą 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> 

drugie, można spróbować użyć RelativeSource podróżować wizualne drzewa i dostać elementu głównego DataContext.

<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> 

Moreove, jeśli ListBox dziedziczy DataContext od elementu głównego (czyli już nie jawnie ustawić DataContext na ListBox). Możesz użyć obu podejść na ListBox, jak również w miejscu okna.

Uwaga - Jak wspomniano here, FindAncestor nie jest zdefiniowana dla Windows Phone 8, ale nazwa elementu działa. Tak więc, spróbuj użyć pierwszego podejścia i powinno to zadziałać.

+2

Wielkie dzięki Rohit! Używam caliburn micro i wygląda na to, że wiążę pracę bez określenia modelu widoku. Tak więc ten działa dla mnie {Binding DataContext.Country, ElementName = myWindow} – devha

+3

ElementName sprawia, że ​​szablony nie nadają się do ponownego użycia, a FindAncestor nie istnieje w aplikacjach WinRT/Windows Store. Jak powiązać kontekst nadrzędny w aplikacjach Windows Store? – Tseng