绑定到DataTemplate中的父DataContext

时间:2011-09-29 08:24:12

标签: .net wpf data-binding datacontext

我正在尝试将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是带有ICommand RemoveItem和ObservableCollection<FileViewModel>文件的ViewModel。

2 个答案:

答案 0 :(得分:13)

如果您使用的是.NET 4,确实有一个更优雅的解决方案:

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

(这要求模板保留在参考资料中,否则会出现周期性依赖性错误)

答案 1 :(得分:4)

菜单不会与您的控件在同一个Visual Tree中绘制,这就是RelativeSource绑定不起作用的原因

您需要绑定到PlacementTarget的{​​{1}}才能访问主要的Visual Tree

ContextMenu