在我的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。我该怎么办? 谢谢!
答案 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>