2010-02-15 8 views
1

У меня возникли проблемы с работой следующего сценария (этот код не является фактическим кодом, но принципы одинаковы). В основном мне нужно передать значение от MainPage до вложенного «многоразового пользователя» control ", который привязывается к его собственным свойствам. Я хочу увидеть текст« Это он! »на экране, но он не установлен в элементе управления SilverlightControl2 (я подозреваю, что это связано с настройкой DataContext), но я как могу это исправить?Вложенная привязка UserControls

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

Как только вы чувствуете себя необходимость сделать это: -

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, так что вы можете» t используйте его в UserControl.