为什么这个相对源绑定到usercontrol代码隐藏中的属性失败?

时间:2010-12-12 01:53:50

标签: wpf binding

 <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; }
    }
}

2 个答案:

答案 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