Как только вы почувствуете необходимость сделать это: -
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
.