0

我有一个简单的自定义用户控件:

<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 这样的东西可能不可用(不一定有用)

4

1 回答 1

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

然后,将用户控件设置DataContextLayoutRoot(在构造函数中初始化之后)。

public MyUserControl()
{
    InitializeComponent();
    LayoutRoot.DataContext = this;
}

编辑以下方式可能更简单(肯定更直接),但需要 Silverlight 5。您可以DisplayText使用RelativeSource.

 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},
                              Path=DisplayText}"/>

所以这里用户控件的 DataContext 仍然可以设置为MainPage,并且这一元素的数据源可以指向用户控件的代码隐藏类。

于 2012-11-15T06:58:29.770 回答