我无法使以下方案工作(此代码不是实际代码,但主体是相同的。基本上我需要将值从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;
}
}
答案 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
中使用它。