无法在元素 ResourceDictionary 中绑定 DataContext

Can't bind DataContext in element ResourceDictionary

在我的 UserConterl 中。

<UserControl.Resources >
    <ResourceDictionary >       
        <ContextMenu x:Key="MyContextMenu " >
            <MenuItem Header="{Binding Header}">
        </ContextMenu >
      <HierarchicalDataTemplate  x:Key="MyTemplate">
        <TextBlock x:Key="MyTextBlock" Text = {Binding Header} ContextMenu="{StaticResource MyContextMenu }"/>
      </HierarchicalDataTemplate >
     </ResourceDictionary > 
</UserControl.Resources>

 <TreeView  ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding MySources}" >

以上 xaml.There 代码中的代码在 UserControl xaml.cs 中。

    public MyUserControl()
    {           
        InitializeComponent();
        this.DataContext = new MyViewModel();
    }


    public class MyViewModel: ViewModelBase
    {
       public string Header {get; set;}
       public List<string> MySources \ Has been assigned
    }

预期的结果是当我点击rightbutton.Actually时显示字段Header,弹出菜单empty.I发现ContextMenu没有绑定DataContext。我应该怎么办? 谢谢!

减去设置你的数据上下文,如果你试图将上下文菜单项绑定到父控件的数据上下文,你必须使用 PlacementTarget.Tag 技巧。这是因为上下文菜单位于不同的可视化树上。

您也不需要 <TextBlock Text="{Binding Header}" 中的页眉,将其保留为 <TextBlock Text="{Binding}"

<Grid Background="DarkGray">
    <Grid.Resources>
        <ContextMenu x:Key="CM">
            <MenuItem Header="{Binding PlacementTarget.Tag.Header,
                                       RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"/>
        </ContextMenu>
        <HierarchicalDataTemplate  x:Key="MyTemplate">
            <TextBlock  Text="{Binding}"  
                        ContextMenu="{StaticResource CM }" 
                        Tag="{Binding DataContext,RelativeSource={RelativeSource AncestorType=TreeView, Mode=FindAncestor}}"/>
  </HierarchicalDataTemplate >
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TreeView Grid.Row="0" 
              ItemTemplate="{StaticResource MyTemplate}"
              ItemsSource="{Binding Sources}"></TreeView>
</Grid>