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