无法在元素ResourceDictionary中绑定DataContext

时间:2015-03-31 10:21:11

标签: c# .net wpf xaml mvvm

在我的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中。代码是.cs的UserControl xaml。

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


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

预期结果是当我点击右键时显示​​字段标题。实际上,弹出菜单是空的。我发现ContextMenu没有绑定DataContext。我该怎么办?  谢谢!

1 个答案:

答案 0 :(得分:1)

设置datacontext,如果您尝试将上下文菜单项绑定到父控件的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>