2010-05-06 7 views
3

J'ai mis mon DataContext comme ceci:WPF Binding Path =/ne fonctionne pas?

<Window.DataContext> 
    <c:DownloadManager /> 
</Window.DataContext> 

DownloadManager est Enumerable<DownloadItem>. Ensuite, je mets mon DataGrid comme ceci:

<DataGrid Name="dataGrid1" ItemsSource="{Binding Path=/}" ... 

Alors qu'il devrait lister tous les DownloadItems, non? Donc, je devrais être en mesure de mettre mes colonnes comme:

<DataGridTextColumn Binding="{Binding Path=Uri, Mode=OneWay}" 

Uri est une propriété de la DownloadItem. Mais ça ne semble pas aimer ça. Dans l'éditeur de propriétés visuelles, il ne reconnaît pas Uri est une propriété valide, donc je devine que je fais quelque chose de mal.

Cela fonctionnait avant, quand j'avais la liaison de la grille de données à Values, mais alors j'ai enlevé cette énumérable du DownloadManager et l'ai rendu énumérable. Comment puis-je réparer ça?

PS: Par "ne fonctionne pas" Je veux dire qu'il ne répertorie aucun élément. J'en ai ajouté au constructeur du DM, donc ça ne devrait pas être vide.

+1

'Path = /' essaie de trouver une propriété de la '' DownloadManager' appelé/'- qui ne va jamais avoir raison. (Si c'était un 'XmlDataSource' vous pourriez utiliser' XPath =/', mais c'est une histoire totalement différente ...) –

+0

@Dan: Ah .. Je viens de choisir" Current Item "dans l'éditeur de propriétés, et c'est ce que ça m'a donné. – mpen

+0

@Dan - Path =/se liera à l'élément actuel dans le DataContext (lorsque DataContext est une collection). Voici une bonne ressource que j'utilise assez souvent en référence aux chemins de liaison: http://www.nbdtech.com/Blog/archive/2009/02/02/wpf-xaml-data-binding-cheat-sheet.aspx –

Répondre

7

Essayez ItemsSource="{Binding}". Cela devrait suffire.

+0

Brillant! Travaillé comme un charme. – mpen

+1

Ou 'ItemsSource =" {Chemin de liaison =.} "'. Les deux font le même travail. – Amsakanna

-1

Comme alternative à la réponse de Danko, j'ai découvert Static Resources! (Je suis un WPF Noob)

<Window x:Class="ImageGetGUI.MainWindow" 
    ... 
    <Window.Resources> 
     <c:DownloadManager x:Key="dm"/> 
    </Window.Resources> 
    ... 
    <DataGrid Name="dataGrid1" ItemsSource="{StaticResource dm}" ... 
+0

Vous pouvez également nommer votre Window.DataContext, c'est-à-dire '' Ceci vous permettra d'accéder au DataContext par son nom dans votre code derrière si nécessaire. Vous pouvez également jeter un oeil à un ObjectDataProvider; Je les ai trouvés extrêmement utiles lorsqu'ils ont été placés dans le dictionnaire de ressources de l'application. Par exemple, lorsque vous avez une collection qui est réutilisée sur plusieurs vues, c'est-à-dire une liste . –

5

En réponse à la question de l'OP pourquoi {Binding} fonctionne, mais {Binding Path = /} ne fonctionne pas, je suis d'ajouter les informations suivantes en réponse à clarifier la différence.

Ce qui suit est tirée de MSDN Data Binding Overview > Binding to Collections:

Pointeurs Article courant

Vues soutenir également l'idée d'un élément en cours . Vous pouvez parcourir les objets dans une vue de collection. Comme vous naviguez, vous déplacez un pointeur qui vous permet de récupérer l'objet qui existe à cet endroit particulier dans la collection. Pour un exemple, voir How to: Navigate Through the Objects in a Data CollectionView.

Parce que WPF se lie à une collection uniquement en utilisant une vue (soit une vue que vous spécifiez , ou la valeur par défaut de la collection point de vue), toutes les liaisons aux collections ont un pointeur de l'élément en cours. Lorsque liaison à une vue, le caractère barre oblique ("/") dans une valeur de chemin désigne l'élément actuel de la vue. Dans l'exemple suivant, le contexte de données est une vue de collection. La première ligne se lie à la collection. La deuxième ligne se lie à l'élément actuel de la collection . La troisième ligne lie à la propriété Description de l'élément actuel de la collection.

<Button Content="{Binding }" /> 
<Button Content="{Binding Path=/}" /> 
<Button Content="{Binding Path=/Description}" /> 
+0

Ohhh ... d'accord. Maintenant je comprends. Elément actuel! = DataContext. C'est le premier élément * dans * DataContext. – mpen