2009-09-25 3 views
1

J'AVONS créer comme le contrôle de l'utilisateur ceci:contrôle utilisateur de liaison WPF avec des données dans le code C#

public partial class View 
    { 
     public View() 
     { 
      InitializeComponent(); 
     } 

     public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(TeaserView)); 

     public string Name 
     { 
      get { return (string)GetValue(NameProperty); } 
      set { SetValue(NameProperty, value); } 
     } 

    } 

XAML:

<UserControl x:Class="Controls.View" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="200" Width="164"> 
    <Grid VerticalAlignment="Stretch" 
      x:Name="Preview"> 

     <Label Height="28" Content="{Binding ElementName=Preview, Path=Name}" Background="LightYellow" x:Name="name" VerticalAlignment="Top" ></Label> 
    </Grid> 
</UserControl> 

et l'utiliser dans Window1 simplement XAML:

<controls:View Height="200" Name="View1" Width="164" /> 

et j'essaie de définir le contenu dans C# (propriété Nom dans cet exemple) mais il ne fonctionne pas, le contenu de l'étiquette est toujours vide. (Toutes les références, etc. sont bonnes) Qu'est-ce qui ne va pas?

Répondre

3

Votre code est erroné. Vous liez à la propriété Grid.Name, qui est "Aperçu", pas à View.Name.

Je vous encourage vraiment à aller lire de A à Z "DataBinding Overview" sur MSDN. Ça vaut le coup, croyez-moi :). En fait toute la section "Windows Presentation Foundation" mériterait votre attention.

En ce qui concerne votre code, cela devrait fonctionner:

<UserControl x:Class="WpfApplication5.View" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Height="300" 
      Width="300" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Grid> 
    <Label Height="28" 
      Content="{Binding Path=Name}" 
      Background="LightYellow" 
      VerticalAlignment="Top"/> 
    </Grid> 
</UserControl> 

Mais êtes-vous sûr de vouloir cacher la propriété « Nom » des parents?

1

Avez-vous défini le datacontext sur le contrôle utilisateur? Essayez de le configurer pour pointer vers son propre code derrière:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 
0

Copie votre code exact et fonctionne correctement.

Cependant, il ne fait pas ce que vous attendez probablement de lui. Vous définissez la source de la liaison sur l'instance Grid. Par conséquent, la propriété Name génère "Aperçu". La propriété Name que vous avez définie dans votre UserControl est ignorée car il existe déjà une propriété Name sur UserControl.

0

J'ai mis la propriété Name comme exemple. Je suis en train de mettre l'étiquette de contenu dans Window1.xaml.cs aime:

View1.Name = "Casablanca"; 
0

Essayez la liaison suivante, il devrait fonctionner:

<Label Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:View}}, Path=Name}" /> 

Vous devez également définir une xmlns: locale = "whatever_path_you_have "sur le dessus du fichier.

Je suggère également de renommer "Name" DP à quelque chose d'autre pour éviter la collusion de noms.