绑定中的WPF父子关系

时间:2013-07-02 12:27:31

标签: c# wpf mvvm binding

我正在开发一个完全基于MVVM的应用程序。我正面临着一个有约束力的问题。

<ListView ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.CurrentSecurityList}">
<ListView.ContextMenu>
 <ContextMenu>
  <MenuItem Header="Remove" Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext.RemoveSecurity}"/>
 </ContextMenu>
</ListView.ContextMenu> 

ListView绑定在这段代码中运行得非常好,但问题来自于MenuItem Command Binding。有人可以解释我在这里做错了什么。

2 个答案:

答案 0 :(得分:2)

ContextMenu适用于不同的可视化树,因此无法像这样绑定它。您需要找到ContextMenu祖先并引用其PlacementTarget.DataContext来检索您的命令。尝试这样的事情:

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

答案 1 :(得分:2)

在ListView中放置一个标签,将其祖先连接到ContextMenu:

<ListView ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.CurrentSecurityList}"
              Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Remove" Command="{Binding PlacementTarget.Tag.DataContext.RemoveSecurity, RelativeSource={RelativeSource 
                                AncestorType=ContextMenu}}"/>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>