Привязка к родительскому DataContext в DataTemplate - PullRequest
7 голосов
/ 29 сентября 2011

Я пытаюсь привязать команду MenuItem к команде, содержащейся в UserControl.DataContext. Я нашел пару похожих вопросов, но решение по ним мне не удается:

<UserControl ...>
<UserControl.Resources>
    <DataTemplate x:Key="TileItemStye">
        <Grid Width="100" Height="100">
            <Grid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Remove" 
                              Command="{Binding DataContext.RemoveItem, 
                              RelativeSource={RelativeSource FindAncestor,
                                             AncestorType=UserControl}}">
                    </MenuItem>
                </ContextMenu>
            </Grid.ContextMenu>
        </Grid>
    </DataTemplate>
</UserControl.Resources>
<Grid>
    <ListView ItemsSource="{Binding Path=Files}" 
              ItemTemplate="{DynamicResource TileItemStye}"  >
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>
</Grid>

UserControl DataContext имеет вид ViewModel с ICommand RemoveItem и ObservableCollection<FileViewModel> файлами.

Ответы [ 2 ]

13 голосов
/ 30 сентября 2011

Если вы работаете в .NET 4, действительно есть более элегантное решение:

<UserControl Name="uc" ...>
<!-- ... -->
    <MenuItem Header="Remove"
              Command="{Binding DataContext.RemoveItem,
                                Source={x:Reference uc}}"/>

(для этого требуется, чтобы шаблон оставался в ресурсах, в противном случае возникнет ошибка циклической зависимости)

4 голосов
/ 29 сентября 2011

Меню не отображаются в том же дереве визуалов, что и ваши элементы управления, поэтому привязка RelativeSource не работает

Вам необходимо привязаться к PlacementTarget вашего ContextMenu, чтобы получить доступ к основному дереву визуалов

<MenuItem Header="Remove" 
          Command="{Binding PlacementTarget.DataContext.RemoveItem, 
              RelativeSource={RelativeSource FindAncestor, 
              AncestorType={x:Type ContextMenu}}}" />
...