绑定中的WPF父子关系

本文关键字:父子关系 WPF 绑定 | 更新日期: 2023-09-27 18:20:39

我正在开发一个完全基于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命令绑定时,问题就来了。有人能解释一下我在这里做错了什么吗。

绑定中的WPF父子关系

在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>

ContextMenu在不同的可视化树上工作,因此不可能像那样绑定它。您需要找到ContextMenu祖先并引用其PlacementTarget.DataContext来检索您的命令。试试这样的东西:

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