2010-10-07 15 views
0

Dans mon interface utilisateur, je souhaite parfois placer des titres au-dessus des contrôles utilisateur. Je veux déclarer ces titres en XAML pour une future localisabilité, donc je veux les garder hors des datacontexts.Liaison à la propriété sur l'élément racine dans DataTemplate via un ContentControl

La connexion de données peut-elle les récupérer à partir d'une propriété définie sur le nœud racine de la commande usercontrol?

J'ai fait bouillir le problème à l'exemple de code suivant:

using System.Windows; 

namespace WpfApplication12 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      this.Person = new Author { Name = "Guge" }; 

      this.DataContext = this; 
     } 

     public object Person { get; set; } 
    } 

    public class Author 
    { 
     public string Name { get; set; } 
    } 
} 

Et:

<Window x:Class="WpfApplication12.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication12" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <DataTemplate DataType="{x:Type local:Author}"> 
     <Border AutomationProperties.Name="Author" BorderThickness="1" BorderBrush="Black"> 
      <Label Content="{Binding Name}"/> 
     </Border> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <Label x:Name="Position" Content="Author"/> 
    <ContentControl x:Name="presentation" Content="{Binding Person}"/> 
</StackPanel> 

Le problème pratique est la suivante: comment puis-je utiliser la liaison de données dans le contenu propriété de l'étiquette "Position" pour récupérer le mot "Author" de la propriété AutomationProperties.Name de la bordure dans le DataTemplate?

Répondre

0

La solution est à ce jour pour ajouter une propriété de chaîne pour TypeName au viewmodel et remplir ce avec le contenu de AutomationProperties.Name dans code-behind. Et utiliser la liaison suivante:

<StackPanel> 
    <Label x:Name="Position" Content="{Binding Person.TypeName}"/> 
    <ContentControl x:Name="presentation" Content="{Binding Person}"/> 
</StackPanel> 

Cependant, je pense toujours qu'il devrait être possible de le faire sans utiliser le ViewModel, je l'espère être en mesure de revenir sur cette question lorsque mes compétences se sont améliorées de liaison de données.

0

Que diriez-vous d'aller la route sur votre objet de données:

public class Author 
{ 
    public string Name { get; set; } 
    public string TypeName { get; set; } // might be better in base class Person 
} 

Et:

<Window.Resources> 
    <DataTemplate DataType="{x:Type local:Author}"> 
     <Border AutomationProperties.Name="{Binding TypeName}" 
       BorderThickness="1" BorderBrush="Black"> 
      <Label Content="{Binding Name}"/> 
     </Border> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <Label x:Name="Position" Content="{Binding ElementName=presentation, Path=DataContext.TypeName}"/> 
    <ContentControl x:Name="presentation" Content="{Binding Person}"/> 
</StackPanel> 
+0

Merci. Et je suppose que définir TypeName au contenu de AutomationProperties.Name dans code-behind? – Guge

+0

Il doit y avoir un endroit où Person.TypeName est défini, oui. D'une manière générale je n'aime pas le codebhind (http://goo.gl/KyTW). Mais si vous l'utilisez, oui c'est probablement l'endroit. – bitbonk

+0

Votre expression de liaison de données pour TypeName ne fonctionne pas. – Guge