L'obtention d'un WPF Listview pour afficher ObservableCollection<T> à l'aide de la liaison de données
J'ai une collection observable de type Projet, que je veux être affichés dans une liste, mais rien n'est ajouté à ma ListView qui je ne comprends pas
Mon MainWindow.xaml
<ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Path=ProjectID}"/>
<TextBlock Text="{Binding Path=ProjectName}"/>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Mon MainWindow.cs
public partial class MainWindow : Window
{
ObservableCollection<Project> Projects = new ObservableCollection<Project>();
ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();
public MainWindow()
{
InitializeComponent();
DataContext = Projects;
Project pro1 = new Project(1, "Swordfish");
Projects.Add(pro1);
Employee empMads = new Employee("Mads", 1);
Employee empBrian = new Employee("Brian", 2);
Employees.Add(empMads);
Employees.Add(empBrian);
}
private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
et mon Projet.cs qui est le fichier de classe
[Serializable]
class Project : INotifyPropertyChanged
{
public Project(int id, string name)
{
ID = id;
Name = name;
}
private int id;
public int ID
{
get { return id; }
set
{
id = value;
NotifyPropertyChanged("ProjectID");
}
}
private string name;
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("ProjectName");
}
}
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
Mais rien n'est ajouté à ma liste, je ne peux pas voir ce que je suis absent pour qu'il fonctionne.
J'ai comme une observablecollection
Je ne DataContext = de la collection
Et je ne la liaison dans le fichier xaml
Modifier codepart 1:
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;
Pensez que vous pourriez publier la façon dont vous configurez votre DataContext?
OriginalL'auteur Mech0z | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous utilisez chemin de liaison comme
ProjectID
tandis que votre Projet de classe a de la propriétéID
. Il en va de même pourProjectName
etName
propriétés.E:
Lorsque vous avez des problèmes avec la liaison, il est très utile de regarder à travers
Output
onglet dans visual studio en mode debug pour voir quelles erreurs ont été renvoyées de liaison de données du moteur. Ces exceptions ne sont normalement pas retourné à l'utilisateur, mais vous pouvez inspecter.Système.De Windows.Erreur de données: 40 : BindingExpression chemin erreur: 'ProjectID biens ne se trouvent pas sur l '"objet" "Projet" (HashCode=41717140)'. BindingExpression:Path=ProjectID; DataItem='Projet' (HashCode=41717140); élément cible est " TextBlock (Nom="); cible de la propriété est de "Texte" (de type 'String') - C'est le message que j'ai trouvé dans ma fenêtre de sortie lorsque j'ai commencé d'abord à votre code. Et oui, il est possible de modifier la source de données lors de l'exécution (je suppose que c'est ce que vous me demandez), mais ici, je n'ai pas assez d'espace. Je suis sûr que vous pouvez trouver sur le web comment faire cela.
Usedful parce que je ne savais pas que VS serait sortie de la liaison de données des erreurs. Qui va réduire mon XAML WPF/temps de débogage beaucoup, cheers!
Je ne vois pas ces erreurs n'importe où, vous ne savez pas pourquoi le mien n'sortie
Sur la fenêtre de Sortie dans la liste déroulante "Afficher le résultat de:" qu'avez-vous sélectionné? Il devrait y avoir de débogage. Si il est prêt à Construire, sélectionnez déboguer. Espérons que ça marchera.
OriginalL'auteur Pako
Comme l'a souligné, il y a quelques problèmes ici. L'un des "problèmes" que vous obtenez comme un nouveau développeur WPF, c'est que vous ne pouvez pas utiliser les variables de membre, vous devez utiliser des propriétés publiques:
Ces, bien sûr, besoin d'être initialisé dans votre constructeur.
Une fois que vous faites cela, vous devez vous assurer que les propriétés de la collection correspondent à ce que vous êtes de liaison sur la liste.
OriginalL'auteur Robaticus
Par défaut de votre membre variables vont être privés. Si ce que vous avez posté ici est votre code, puis le code XAML n'a aucun moyen d'y accéder. Ces propriétés publiques:
Champs d'Instance sont privés par défaut. Si vous regardez son code, il omet tout modificateur de portée, ce qui les rend privé.
Je veux dire, ce que vous avez écrit sont des champs publics, les liaisons besoin des propriétés publiques, pour autant que je sais.
Il n'a pas d'importance de toute façon, comme vous pouvez le mettre domaine privé comme datacontext. Ou au moins, il fonctionne très bien sur mon VS2010 😉
Bien sûr c'est possible, vous avez juste deux liaisons avec des Chemins différents (ce qui est une autre raison pourquoi vous ne devriez pas régler le DataContext de la fenêtre pour quelque chose d'aussi précis que l'une de ses propriétés, au lieu de le définir à lui-même par l'intermédiaire de "DataContext = this;", puis les liaisons sont {Binding Projets) et {Binding Employés})
OriginalL'auteur Josh
1.Votre liste doit être un bien public (Edit: sauf si vous définissez le DataContext comme vous l'avez fait...) (
public ObservableCollection<Project> Projects {get;}
)2.Votre notification doit être le même que le nom de la propriété:
3.La liaison doit être de cette façon:
Je pense...
Si votre fenêtre est nommé Mafenêtre dans le code Xaml de votre liaison pourrait être fait avec ItemsSource="{Binding ElementName=Mafenêtre, Path=Projets}"
OriginalL'auteur H.B.