绑定到依赖属性

时间:2012-11-15 06:47:16

标签: c# silverlight windows-phone-7

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

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

1 个答案:

答案 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,这个元素的数据源可以指向用户控件的代码隐藏类。