<MenuItem Header="{Binding Hello, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type v:ProjectElementView}}}" />
v:ProjectElementView是usercontrol的类型。
我也尝试过命名usercontrol并使用ElementName绑定。
- 编辑 -
UserControl.xaml
<UserControl>
<Grid>
<TabControl>
<TabControl.ContextMenu>
<ContextMenu>
<MenuItem Header="{Binding Path=Hello, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type v:ProjectElementView}}}" />
</ContextMenu>
</TabControl.ContextMenu>
</Grid>
UserControl.xaml.cs
public partial class ProjectElementView : UserControl
{
private string _hello = "hello";
public string Hello
{
get { return _hello; }
set { _hello = value; }
}
}
答案 0 :(得分:2)
你可以这样做
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}, Path=DataContext.Message}" />
修改
RelativeSource属性用于将相对于当前对象定位的对象指定为源 如需更多检查here。
关键是我认为你不能使用RelativeSource访问非datacotext属性
答案 1 :(得分:2)
似乎有效的几种方法
<UserControl x:Name="sample" >
<Grid>
<TabControl DataContext="{Binding ElementName=sample}" >
<TabControl.ContextMenu>
<ContextMenu >
<MenuItem Header="{Binding Path=Hello}" />
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
</Grid>
或
<UserControl>
<Grid>
<TabControl >
<TabControl.ContextMenu>
<ContextMenu >
<MenuItem Header="{Binding Path=Hello}" />
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
</Grid>
重点是你不能在没有设置datacontext的情况下访问属性背后的代码。但我建议你将你的属性移动到一个viewmodel类并绑定到那个类。这给你更多的灵活性。
只需查看此链接了解更多信息
http://serialseb.blogspot.com/2007/10/wpf-tips-8-use-your-code-behind-for.html