第一次控制 我可以使用名为UserNameLabel的DependencyProperty创建UserControl。然后,我可以在UserControl上将datacotext设置为relativesource self并在标记中填充属性。
...
public String UserNameLabel
{
get { return (String)GetValue(UserNameLabelProperty); }
set { SetValue(UserNameLabelProperty, value); }
}
// Using a DependencyProperty as the backing store for UserNameLabel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty UserNameLabelProperty =
DependencyProperty.Register("UserNameLabel", typeof(String), typeof(LoginControl), new PropertyMetadata());
<Grid x:Name="LayoutRoot">
<local:LabelTextBox Height="37" Margin="10,24,43,0" VerticalAlignment="Top" Label="{Binding UserNameLabel}"/>
</Grid>
...
第二次控制 我还可以创建一个LabelTextBox控件,并使用类似的Label属性将relativesource self设置为它。
...
public String Label
{
get { return (String)GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
// Using a DependencyProperty as the backing store for Label. This enables animation, styling, binding, etc...
public static readonly DependencyProperty LabelProperty =
DependencyProperty.Register("Label", typeof(String), typeof(LabelTextBox), new PropertyMetadata(String.Empty));
...
<Grid x:Name="LayoutRoot">
<TextBlock Height="17" VerticalAlignment="Top" TextWrapping="Wrap" Text="{Binding Label}"/>
但是,如果我想在第一个usercontrol中嵌套LabelTextBox,我似乎无法在LabelTextBox的Label属性上绑定到UserNameText属性。
这似乎是一种创建控件的逻辑方法,您可以在其中设置父控件或子控件的属性以设置子控件的属性。
请帮助我。
答案 0 :(得分:0)
不,这不是一个好方法,您不应该假设您可以控制UserControl
的任何公开可用属性,包括DataContext
。
当我想将元素的属性绑定到包含UserControl
的属性时,我使用这种方法: -
<Grid x:Name="LayoutRoot">
<TextBlock Text="{Binding Parent.Label, ElementName=LayoutRoot}" />
</Grid>
这使用ElementName
将绑定源设置为UserControl的Child。然后,属性路径中的Parent
找到UserControl
本身,之后我们可以绑定到所需的任何属性,在本例中为Label
属性。
在这种方法中,您无需使用DataContext
。