2010-12-09 62 views
1

Tenir compte de ce conteneur:Comment lier une propriété dans itemtemplate à une propriété dans itemsource?

public class ItemInfo : DependencyObject 
{ 
    public string Name { get; set; } 
    public ObservableCollection<SomeDataItem> DataValues { get; set; } 
    ... 
    Dependency object registration and event handling 
    ... 
} 

public class MyItemSource : ObservableCollection<ItemInfo> 
{ 
    ... 
} 

Maintenant, je souhaite afficher ces données dans un listview où le contrôle qui affiche l'élément est personnalisé. Pour cela, je définirais MyItemSource à ItemSource de listview et définirais un ItemTemplate. Cependant, il semble que je n'ai pas accès à ItemInfo dans le ItemTemplate. Ceci est mon XAML:

<Grid> 
    <ListBox ItemsSource="{StaticResource MyStaticDataSource}" 
     Grid.IsSharedSizeScope="True"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <local:ItemInfoUserControl x:Name="itemInfoUserControl" 
       Name = "{Binding Name}"  <--- this doesn't work 
       Data = "{Binding DataValues}" <--- this doesn't work 
       Width="300" Height="200" 
       Grid.Row="1"> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    </Grid> 

Au lieu de se lier à itemInfo de ItemSource, il se lie aux propriétés ItemInfoUserControl, ce qui est pas ce que je veux qu'il fasse. Existe-t-il un moyen de lier des propriétés dans itemtemplate à une propriété dans itemsource? Ou y a-t-il une approche alternative à ce que j'essaie finalement d'accomplir?

Merci!

+0

Je pense que cela pourrait être dû au fait que vous essayez de définir 'x: Name' et' Name' en même temps. Voir ma modification ci-dessous. – Donut

Répondre

1

Eh bien, tout d'abord vous devez utiliser une bonne binding syntax:

Name = "{Binding Name}" 

et

Data = "{Binding DataValues}" 

au lieu de "Name = "Binding Name"" et "Data = "Binding DataValues"". Notez l'ajout de "{" et "}" autour de votre expression de liaison.
Ceci peut être suffisant pour résoudre votre problème, tant que Name et DataValues sont DependencyProperties dans ItemInfoUserControl. Si ce n'est pas le cas, vous devrez les implémenter comme DependencyProperties afin de pouvoir les lier en XAML. Voir here pour un bon article MSDN sur la définition des propriétés de dépendance personnalisées.


Edit: Aussi, juste remarqué - vous définissez les deux x:Name et Name. De this article sur MSDN:

If Name is available as a property on the class, Name and x:Name can be used interchangeably as attributes, but a parse exception will result if both are specified on the same element. If the XAML is markup compiled, the exception will occur on the markup compile, otherwise it occurs on load.

Retirez x:Name="itemInfoUserControl" et voir si cela aide.

+0

Euh, désolé, j'étais pressé. En fait, la syntaxe de liaison était une faute de frappe lors de la publication ici et j'ai des dépendances définies. – user315648

+0

La syntaxe correcte n'est-elle pas Name = "{Binding Path = Name"}? – wangburger

+0

'Name = {Binding Path = Name}' et 'Name = {Binding Name}' sont équivalents. Voir http://msdn.microsoft.com/en-us/library/cc189022(v=vs.95).aspx – Donut