我有一个简单的自定义用户控件:
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBlock Text="{Binding DisplayText}"/>
<TextBlock Text="{Binding PersonName}"/>
</StackPanel>
</Grid>
我在MainPage.xaml中使用它如下:
<local:WindowsPhoneControl1 x:Name="customControl" DisplayText="test">
</local:WindowsPhoneControl1>
如果在MainPage.xaml.cs中我做了:
PersonName = "George";
customControl.DataContext = this;
然后显示 George ,但 test 不显示。这是有道理的,但我不知道如何绑定到DisplayText属性。
当然,以下内容无效,因为 George 不会显示:
customControl.DataContext = customControl;
请注意,这应该适用于WP / silverlight开发,因此可能无法获得像AncestorType这样的东西(并不一定非常有用)
答案 0 :(得分:1)
这可能不止一种方法。这是一个:为PersonName
的用户控件添加依赖属性,为DisplayText
添加常规属性(由于您没有绑定它,因此不需要DP)。
public static readonly DependencyProperty =
DependencyProperty.Register("PersonName", typeof(string), typeof(MyUserControl), null);
public string DisplayText { get; set; }
public string PersonName
{
get { return (string)GetValue(PersonNameProperty); }
set { SetValue(PersonNameProperty, value); }
}
然后,将用户控件的DataContext
设置为LayoutRoot
(在构造函数中初始化之后)。
public MyUserControl()
{
InitializeComponent();
LayoutRoot.DataContext = this;
}
编辑以下方式可能更容易(绝对更直接),但需要Silverlight 5.您可以使用RelativeSource
使用它绑定到属性DisplayText
。
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},
Path=DisplayText}"/>
所以这里用户控件的DataContext仍然可以设置为MainPage
,这个元素的数据源可以指向用户控件的代码隐藏类。