Доступ к ViewModel списка из контекстного меню элемента списка


Недавно возник следующий вопрос. Есть ListBox, элементы которого берутся из коллекции ViewModel. Их вид задаётся через ItemsTemplate. В ItemsTemplate задано контекстное меню. Необходимо добавить в это контекстное меню MenuItem, заголовок которого брался бы из ViewModel.
Доступ к ViewModel списка из контекстного меню элемента списка

Для примера я создал ViewModel с именем SampleViewModel, в которой есть коллекция SomeCollection, представляющая собой элементы списка и свойство SomeString, которое представляет собой текст, который должен выводиться в заголовке MenuItem.
Потом создал DataTemplate для элемента списка:
<DataTemplate>
  <Border Background="Transparent" Padding="3">
    <TextBlock Text="{Binding}">
      <TextBlock.ContextMenu>
        <ContextMenu x:Name="menu">
          <MenuItem Header="Menu Item 1"/>
          <MenuItem Header="Menu Item 2"/>
          <MenuItem Header="Menu Item 3"/>
        </ContextMenu>
      </TextBlock.ContextMenu>
    </TextBlock>
  </Border>
</DataTemplate>
Затем добавил в контекстное меню ещё один пункт, заголовок которого брался бы из ViewModel. Но добраться до ViewModel из MenuItem напрямую у меня не получилось, поэтому пришлось в Tag верхнего Border в DataTemplate записать DataContext ListBox-а:
<DataTemplate>
  <Border Background="Transparent" Padding="3" Tag="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}">
    <TextBlock Text="{Binding}">
      <TextBlock.ContextMenu>
        <ContextMenu x:Name="menu">
          <MenuItem Header="Menu Item 1"/>
          <MenuItem Header="Menu Item 2"/>
          <MenuItem Header="Menu Item 3"/>
          <MenuItem Header="{Binding Path=PlacementTarget.Parent.Tag.SomeString,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
        </ContextMenu>
      </TextBlock.ContextMenu>
    </TextBlock>
  </Border>
</DataTemplate>

Скачать исходники:

КОММЕНТАРИИ


Tom
Tom 15.09.2013 12:02:10 #1
Your posting is aboslutely on the point!

НОВЫЙ КОММЕНТАРИЙ


*жирный*
_курсив_
+подчеркнутый+
! заголовок 1
!! заголовок 2
* список
** список 2
# нумерованый список
## нумерованый список 2
[url:http://www.example.com]
{"без форматирования"}
Полное описание синтаксиса