我有一个包含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”。
您对此有何建议?
答案 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'它有效。不是最优雅的解决方案,但它可以为您的方案完成工作