Привязать к исходному datacontext (из источника items)

В моем приложении Windows Phone 8 у меня есть список элементов. Я определил ItemTemplate для элементов списка.

Я хочу отображать в каждом из этих элементов одно значение из модели представления, а не из самого элемента списка. Как настроить привязку из элемента списка в viewmodel.

Мой шаблон данных выглядит следующим образом:

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

Итак, как связать свойство Country, чтобы просмотреть модель, а не элемент списка (в источнике элемента).

Ответы

Ответ 1

Поскольку вы отметили свой вопрос с помощью WPF, я могу рассказать вам, как это сделать в WPF, вы можете проверить, можно ли его повторно использовать в приложениях телефона Windows 8.

Сначала, вы можете дать x:Name корневой элемент, к которому привязан ViewModel. Скажите это окно, установите x: Name на нем и привяжите с помощью 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>

Второй, вы можете попробовать использовать RelativeSource для перемещения визуального дерева и получения корневого элемента 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>

Далее, если ListBox наследует DataContext из корневого элемента (т.е. вы явно не устанавливаете DataContext в ListBox). Вы можете использовать оба подхода в ListBox, а также вместо Window.

Примечание. Как упоминалось здесь, FindAncestor не определен для телефона Windows 8, но имя элемента работает. Итак, попробуйте использовать первый подход, и он должен работать для вас.