Reputation: 424
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
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