Silverlight:如何绑定到父视图的DataContext?

时间:2011-02-17 09:30:45

标签: silverlight xaml silverlight-4.0

我有一个包含childView的ParentView

<UserControl ... x:Name="MyParentView">
     <Grid>
        <sdk:TabControl Name="ContactTabControl">
            <sdk:TabItem Header="Contact" Name="CustomerTabItem">
                <Grid>
                    <Views:CustomerView/>
                </Grid>
            </sdk:TabItem>
        </sdk:TabControl>
    </Grid>
</UserControl>

在我的CustomerView中,我想将Firstname文本框绑定到Parent的DataContext。我在CustomerView中尝试了这个:

<TextBox Text={Binding ElementName=MyParentView, Path=DataContext.Firstname} />

我觉得CustomerView根本无法看到它的父级,因此永远不会找到ElementName“MyParentView”。

您对此有何建议?

2 个答案:

答案 0 :(得分:4)

我做了类似的事情,但我直接将它绑定到Path,考虑到如果我不给它显式数据上下文,它将查找层次结构并找到匹配的。

所以这应该得到你想要的东西:

<TextBox Text={Binding Path=FirstName} />

如果您需要指定显式的datacontext,您可以随时执行:

<Grid>
    <Views:CustomerView DataContext={"CustomContextHere"}/>
</Grid>

答案 1 :(得分:2)

Maverik的另一种解决方案是:

1在客户视图中定义依赖项属性:

public partial class CustomerView : UserControl
    {
        public CustomerView()
        {
            InitializeComponent();
        }

        public static DependencyProperty FirstNameProperty =
            DependencyProperty.Register("FirstName", typeof(string), typeof(CustomerView), new PropertyMetadata(string.Empty, CustomerView.FirstNameChanged));

        public string FirstName
        {
            get { return (string)GetValue(FirstNameProperty); }
            set { SetValue(FirstNameProperty, value); }
        }

        private static void FirstNameChanged(object sender, DependencyPropertyChangedEventArgs e)
        { }
    }

2修改客户视图的文本框以绑定到此依赖项属性(请注意元素绑定“this”)

<UserControl x:Class="SLApp.CustomerView"
    x:Name="this"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox Text="{Binding Path=FirstName, ElementName=this, Mode=TwoWay}"/>
    </Grid> </UserControl>

3修改父视图并将其DataContext绑定到新的依赖项属性

<sdk:TabControl Name="ContactTabControl">
                        <sdk:TabItem Header="Contact" Name="CustomerTabItem">
                            <Grid>
                                <local:CustomerView FirstName="{Binding ElementName=ContactTabControl, Path=DataContext}"/>
                            </Grid>
                        </sdk:TabItem>
                    </sdk:TabControl>

4设置父级的DataContext

public partial class MyParentView : UserControl
    {
        public MyParentView()
        {
            InitializeComponent();

            ContactTabControl.DataContext = "A name";
        }
    }

Voila'它有效。不是最优雅的解决方案,但它可以为您的方案完成工作