2009-03-04 72 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