2009-03-04 9 views
2

Dans Silverlight XAML, je pense que je viens de réaliser qu'une déclaration DataContext sur un conteneur imbriqué est relative au DataContext du conteneur parent. Pouvez-vous tous s'il vous plaît confirmer. Si oui, alors laissez-moi poser ceci: Sur un élément conteneur XAML enfant (par exemple StackPanel) comment voulez-vous sortir de cette arborescence DataContext relative, et commencer à un endroit plus élevé, ou démarrer un DataContext différent tous ensemble si vous voulez définir le DataContext sur le StackPanel à un contexte racine différent? En d'autres termes, comment libérer le DataContext enfant du DataContext parent?Silverlight - DataContext relatif en XAML?

(recherche de solution/syntaxe du code XAML)

Répondre

3

Votre première assumnption est correcte. Le DataContext est un peu hérité par les éléments imbriqués .

Dans un élément de conteneur XAML enfant, vous pouvez toujours redéfinir le DataContext.

Voir exemple ci-dessous:

 

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

Et voici le « modèle » des classes pour l'exemple ci-dessus:

 

    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

Votre exemple crée les objets dans le XAML. Mes objets sont instanciés dans le constructeur. Ainsi, quel XAML à utiliser dans chaque pour pointer vers les objets puisqu'ils ne sont pas dans les UserControl.Respources du XAML. – MattSlay

+0

De plus, j'ai besoin d'une liaison persistante. Besoin de quelque chose comme ceci: MattSlay

+0

Si vous ne voulez pas utiliser l'option XAML, vous pouvez créer une classe qui expose une instance d'autres classes propriétés publiques. Vous devez lier ce "présentateur" à "LayoutRoot" et utiliser ses propriétés comme source pour les autres éléments. – Klinger

Questions connexes