2009-03-04 73 views
2

在Silverlight XAML中,我認爲我剛剛意識到嵌套容器上的DataContext聲明與父容器的DataContext相關。你能不能請你確認一下。Silverlight - XAML中的相對DataContext?

如果是這樣,那麼讓我問一下:在一個孩子的XAML容器元素(即StackPanel)上,你將如何跳出相對的DataContext樹,並從更高的地方開始,或者開始一個不同的DataContext在一起如果你想將StackPanel上的DataContext設置爲不同的根上下文?

換句話說,如何破解父DataContext的子DataContext?

(尋找XAML代碼解決方案/語法)

回答

3

您的第一個錯誤是正確的。 DataContext是由嵌套元素繼承的。

在子XAML容器元素上,您總是可以重新定義DataContext的內容。

見下面的例子:

 

    <UserControl.Resources> 
     <local:Customer x:Key="Cust"> 
     <local:Supplier x:Key="Supp"> 
    </UserControl.Resources> 
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource Cust}"> 
     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <StackPanel Orientation="Horizontal" Grid.Row="0"> 
      <TextBlock Text="Customer Name: " /> 
      <TextBox Text="{Binding Path=Name}"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" Grid.Row="1" DataContext="{StaticResource Supp}"> 
      <TextBlock Text="Supplier Name: " /> 
      <TextBox Text="{Binding Path=Name}"/> 
      <TextBlock Text=" Telephone: " /> 
      <TextBox Text="{Binding Path=Telephone}"/> 
     </StackPanel> 
    </Grid> 
 

這裏是上面的例子中的「模型」類:

 

    public class Customer 
    { 
     public Customer() 
     { 
      Name = "Customer name"; 
      Address = "Customer address"; 
     } 
     public string Name { get; set; } 
     public string Address { get; set; } 
    } 

    public class Supplier 
    { 
     public Supplier() 
     { 
      Name = "Supplier name"; 
      Address = "Supplier address"; 
      Telephone = "(555)555-5555"; 
     } 

     public string Name { get; set; } 
     public string Address { get; set; } 
     public string Telephone { get; set; } 
    } 
 
+0

您的示例在XAML中創建對象。我的對象在構造函數中實例化。那麼,由於XAML不在XAML的UserControl.Respources中,因此每個XAML都要使用它們指向對象。 – MattSlay 2009-03-04 18:48:28