UserControls的嵌套绑定

时间:2010-02-15 10:51:53

标签: silverlight

我无法使以下方案工作(此代码不是实际代码,但主体是相同的。基本上我需要将值从MainPage传递到嵌套的“可重用用户控件”绑定我希望在屏幕上看到“This is it!”文本,但它没有在SilverlightControl2控件中设置(我怀疑是由于DataContext的设置) - 但是我该如何修复它? / p>

MainPage.xaml中

<Grid>
    <ContentPresenter>
        <ContentPresenter.Content>
            <Local:SilverlightControl1 OneValue="This is it!"/>
        </ContentPresenter.Content>
    </ContentPresenter>
</Grid>

SilverlightControl1.xaml

<Grid>
    <Local:SilverlightControl2 TwoValue="{Binding OneValue}"/>
</Grid>

SilverlightControl1.xaml.cs

public partial class SilverlightControl1 : UserControl
{
    public string OneValue
    {
        get { return (string)GetValue(OneValueProperty); }
        set { SetValue(OneValueProperty, value); }
    }

    public static readonly DependencyProperty OneValueProperty = DependencyProperty.Register(
        "OneValue", typeof(string), typeof(SilverlightControl1), new PropertyMetadata(string.Empty));

    public SilverlightControl1()
    {
        InitializeComponent();
        this.DataContext = this;
    }
}

SilverlightControl2.xaml

<Grid x:Name="LayoutRoot" Background="White">
    <TextBlock Text="{Binding TwoValue}"  Foreground="Blue" />
</Grid>

SilverlightControl2.xaml.cs

public partial class SilverlightControl2 : UserControl
{
    public string TwoValue
    {
        get { return (string)GetValue(TwoValueProperty); }
        set { SetValue(TwoValueProperty, value); }
    }

    public static readonly DependencyProperty TwoValueProperty = DependencyProperty.Register(
        "TwoValue", typeof(string), typeof(SilverlightControl2), new PropertyMetadata(string.Empty));


    public SilverlightControl2()
    {
        InitializeComponent();
        this.DataContext = this;
    }
}

1 个答案:

答案 0 :(得分:1)

一旦你发现自己觉得有必要这样做: -

this.DataContext = this; 

知道你可能有问题。它可能是我期望在Silverlight特定的“难闻气味列表”上找到的第一件事。

在您专攻UserControl的情况下,更好的方法是: -

SilverlightControl1.xaml

<Grid>         
    <Local:SilverlightControl2 x:Name="MyControl2" />         
</Grid>

SilverlightControl1.xaml.cs(我只是展示构造函数,其余的就像你一样)

public SilverlightControl1()  
{  
    InitializeComponent();  
    MyControl2.SetBinding(SilverlightControl2.TwoValueProperty , new Binding("OneValue") { Source = this });

} 

SilverlightControl2.xaml

<Grid x:Name="LayoutRoot" Background="White">               
    <TextBlock x:Name="MyTextBox"  Foreground="Blue" />               
</Grid> 

SilverlightControl1.xaml.cs(我只是展示构造函数,其余的就像你一样)

public SilverlightControl2()  
{  
    InitializeComponent();  
    MyTextBox.SetBinding(TextBox.TextProperty , new Binding("TwoValue") { Source = this });  
} 

由于在UserControls中您知道XAML的结构,并且您可以在代码中命名您需要访问的元素,因此您可以使用一行代码来创建绑定。 这使得DataContext可以自由地执行设计,而不是为了不同的目的而高兴。

替代方法,而不是专门化UserControl您创建模板化控件,在这种情况下,绑定可以使用以下内容在XAML中表示: -

<TextBox Text="{TemplateBinding TwoValue}" />

模板绑​​定仅适用于ControlTemplate,因此您无法在UserControl中使用它。