Доступ к ViewModel списка из контекстного меню элемента списка
29 января 2012 - 14:46
Недавно возник следующий вопрос. Есть ListBox, элементы которого берутся из коллекции ViewModel. Их вид задаётся через ItemsTemplate. В ItemsTemplate задано контекстное меню. Необходимо добавить в это контекстное меню MenuItem, заголовок которого брался бы из ViewModel.
Для примера я создал ViewModel с именем SampleViewModel, в которой есть коллекция SomeCollection, представляющая собой элементы списка и свойство SomeString, которое представляет собой текст, который должен выводиться в заголовке MenuItem.
Потом создал DataTemplate для элемента списка:
Затем добавил в контекстное меню ещё один пункт, заголовок которого брался бы из ViewModel. Но добраться до ViewModel из MenuItem напрямую у меня не получилось, поэтому пришлось в Tag верхнего Border в DataTemplate записать DataContext ListBox-а:
Скачать исходники:
Для примера я создал 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>
<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>
Скачать исходники: