2009-03-04 30 views
2

Silverlight XAML'de, yuvalanmış bir kapsayıcıdaki bir DataContext bildiriminin, üst kapsayıcının DataContext öğesine göre olduğunu fark ettim. Hepiniz onaylayabilir misiniz?Silverlight - XAML'deki göreceli DataContext?

Eğer öyleyse, o zaman şunu sormama izin verin: Bir çocuk XAML konteynır elemanında (yani StackPanel), bu göreceli DataContext ağacından nasıl atlarsınız ve daha yüksek bir yerde başlarsınız veya farklı bir DataContext'i birlikte başlatırsınız DataContext'i StackPanel üzerinde farklı bir kök bağlamına ayarlamak istediyseniz?

Başka bir deyişle, DataContext alt öğesinin DataContext'ten nasıl ayrılır?

cevap

3

İlk assumnption doğrudur (XAML kod çözümü/sözdizimi arıyorsunuz). DataContext, iç içe geçmiş öğeler tarafından devralınmıştır.

Çocuk XAML kapsayıcı öğesinde, DataContext'in ne olduğunu her zaman yeniden tanımlayabilirsiniz.

Aşağıdaki örneğe bakın:

 

    <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> 
 

Ve burada yukarıdaki örneğin "Modeli" sınıfları şunlardır:

 

    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

Sizin örnek XAML nesneleri oluşturur. Nesneler kurucuda başlatıldı. Bu nedenle, XAML'nin, XAML'nin UserControl.Respources'ında olmadıklarından, nesnelere işaret etmek için her birinde kullanması gerekenler. – MattSlay

+0

Artı, kalıcı bağlamaya ihtiyacım var. Bunun gibi bir şeye ihtiyacınız var: MattSlay

+0

XAML seçeneğini kullanmak istemiyorsanız, diğer sınıfların bir örneğini gösteren bir sınıfı oluşturabilirsiniz. kamu mülkleri. Bu "sunum yapan kişi" yi "LayoutRoot" öğesine bağlamanız ve diğer öğeler için özelliklerini kullanmanız gerekir. – Klinger