zhangyiying
zhangyiying

Reputation: 424

Can't bind DataContext in element ResourceDictionary

In my 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}" >

above codes in xaml.There codes is in .cs of 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
    }

The result expected is that display the field Header when I click rightbutton.Actually, the Popup Menu is empty.I found ContextMenu didn't bind DataContext. What should I do? Thank!

Upvotes: 0

Views: 1269

Answers (1)

TYY
TYY

Reputation: 2716

Minus setting up your datacontext, if you are trying to bind context menu items to a parent control's datacontext, you have to use the PlacementTarget.Tag trick. This is because the context menu is on a different visual tree.

You also don't need the Header in <TextBlock Text="{Binding Header}", leave it as <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>

Upvotes: 1

Related Questions