7
votes

Obtenir un WPF ListView pour afficher Observablecollection Utilisation de la base de données

J'ai une collection observable de type projet, que je souhaite être affichée dans une liste de liste, mais rien n'est ajouté à ma liste que je ne comprends vraiment pas

My MainWindow.xaml P>

        public ObservableCollection<Project> Projects { get; set; }
    public ObservableCollection<Employee> Employees { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Projects = new ObservableCollection<Project>();
        Employees = new ObservableCollection<Employee>();

        DataContext = Projects;


1 commentaires

Pensez que vous pourriez poster comment vous configurez votre DataContext?


4 Réponses :


4
votes

C'est parce que vous utilisez un chemin de liaison comme projecdid pendant que votre classe de projet comporte la propriété ID . Il en va de même pour ProjectName et nom Propriétés.

e: Lorsque vous rencontrez des problèmes de liaison, il est très utile de regarder via l'onglet de la sortie dans le mode de débogage de Visual Studio pour voir quelles erreurs ont été renvoyées du moteur Databindinging. Ces exceptions ne sont normalement pas retournées à l'utilisateur, mais vous pouvez les inspecter là-bas.


6 commentaires

Cela a fonctionné, mais je ne vois rien dans ma sortie ou ma liste d'erreur lorsque c'est écrit dans le mauvais sens. BTW est-il possible d'avoir une combinobox que j'ai dans le même document XAML Document Databind à une autre liste?


ERREUR SYSTEM.WINDOWS.DATA: 40: Erreur de chemin de liaison suivante: «ProjectId» Propriété introuvable sur 'Object' '' '' '' 'Project' (hashcode = 41717140) '. Bindingexpression: chemin = projecteur; Dataitem = "projet" (hashcode = 41717140); L'élément cible est 'textblock' (nom = ''); La propriété cible est 'Text' (type 'String') - C'est le message que j'ai trouvé dans ma fenêtre de sortie lorsque j'ai commencé votre code. Et oui, il est possible de modifier la source de données en runtime (je suppose que c'est ce que vous demandez), mais ici, je n'ai pas assez d'espace. Je suis sûr que vous pouvez trouver sur le Web comment faire cela.


Invité parce que je ne savais pas que VS émettrait les erreurs de base de données. Cela va réduire mon temps de débogage XAML / WPF, acclamations!


Je ne vois pas ces erreurs nulle part, je ne sais pas pourquoi le mien ne génère pas que


Sur la fenêtre de sortie dans Dropdown "Afficher la sortie de:" Qu'est-ce que vous avez sélectionné? Il devrait y avoir du débogage. S'il est prêt à construire, que Sélectionnez Débogage. J'espère que ça va marcher.


Il y a: s n'est pas sûr de ce que j'ai fait auparavant depuis qu'il n'a pas montré, mais merci c'est très utile



1
votes

Par défaut, vos variables de membre vont être privées. Si ce que vous avez posté ici est votre code réel, le XAML n'a aucun moyen d'y accéder. Rend ces propriétés publiques: xxx


9 commentaires

Ce sont des domaines publics, pas sûr, mais je ne pense pas que cela fonctionnera non plus.


Les champs d'instance sont privés par défaut. Si vous regardez son code, il omet tout modificateur d'étendue, ce qui les rend privé.


Je veux dire ce que vous avez écrit sont des domaines publics, les liaisons ont besoin de propriétés publiques autant que je sache.


Comme vous pouvez également définir un champ privé comme DataContext également. Ou au moins cela fonctionne simplement bien sur mon VS2010;)


Je ne sais pas comment le faire sans utiliser DataContext si je ne veux pas utiliser cela, quelles parties devraient être changées?


L'utilisation de DataContext a raison ... surprise sur les champs privés. Les docs énoncent explicitement cela ne sont pas possibles: MSDN.MicRosoft.com/en-us /Library/ms743643.casaspx


@ Mech0z: Vous pouvez également définir un chemin de liaison indépendant de DataContext à l'aide de l'élémentName, de la religionource ou de la source. par exemple. Pour se lier à la propriété déclarée dans le code derrière une fenêtre, vous pouvez donner à la fenêtre un nom et faire une liaison comme ceci {élément de liaison = myWindow, chemin = myProperty}


N'est-il pas possible de lier les projets à la listeView, puis de lier les employés à une combinocox lorsque les projets et les employés sont observables qui sont définis dans My MainWindow.CS?


Bien sûr, cela est possible, vous aurez juste deux liaisons avec des chemins différents (ce qui est une autre raison pour laquelle vous ne devez pas définir le DataContext de la fenêtre sur quelque chose aussi spécifique que l'une de ses propriétés, plutôt la définition à elle-même via "DataContext =" Ceci; ", alors les reliures sont {projets de liaison) et {employés obligatoires})



3
votes

Comme indiqué, il y a quelques problèmes ici. L'un des "gotchas" qui vous obtient en tant que nouveau développeur WPF est que vous ne pouvez pas utiliser les variables des membres, vous devez utiliser des propriétés publiques:

public ObservableCollection<Project> Projects { get; set; }
public ObservableCollection<Employee> Employees { get; set; }


2 commentaires

Eh bien, peut-être que je me trompe, mais vous pouvez utiliser un domaine privé comme DataContext (c'est ce que fait Mech0z) et tout fonctionne tout simplement bien.


Merci, une fois que j'ai converti mes champs publics vers des propriétés, la liaison a commencé à travailler.



0
votes

1.Votre liste doit être une propriété publique (éditer: sauf si vous définissez le DataContext comme vous l'avez fait ...) ( Observablecollection publique Projets {get;} code>)

2.Votre notification doit être identique au nom de la propriété réelle: P>

<TextBlock Text="{Binding Path=ID}"/>


2 commentaires

Si je fais des propriétés comme vous pouvez le voir dans mon "code modifier 1", j'ai ajouté à la question principale et commenter les projets DataContext = Les projets, alors rien n'est ajouté, alors j'ai besoin de changer ma liaison dans ma liste de liste, mais que faut-il être?


Si votre fenêtre est nommée MyWindow dans XAML, votre liaison pourrait être effectuée avec itemsource = "{élément de liaison = myWindow, chemin = Projets}"