J'ai une page XAML simple avec un ListView dessus défini comme ceci
<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding People}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
</ListView>
Dans le code derrière je fais: -
public ObservableCollection<Person> People { get; set; }
public ListView()
{
InitializeComponent();
this.People = new ObservableCollection<Person>();
this.People.Add(new Person() { Name = "John Doe", Age = 42, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "[email protected]" });
}
Si je définis la ItemsSource de ma liste dans le code derrière comme ceci
lvUsers.ItemsSource = this.People;
cela fonctionne et ma grille s'affiche comme prévu
Cependant, si je supprime cette ligne et essaie de lier dans le XAML
<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding People}">
ça ne marche plus.
Pourquoi la liaison dans le XAML ne fonctionne-t-elle pas?
Si vous ne le faites pas déjà, en XAML par exemple, vous devez définir DataContext
pour votre liaison. De plus, puisque la propriété People
n'implémente pas INotifyPropertyChanged
, vous voudrez peut-être créer cette liste avant InitializeComponent
, au moins avant de définir DataContext
, pour être sûr de la liste est prêt lorsque la liaison est évaluée. Vous pouvez ajouter à votre ObservableCollection
plus tard, mais si vous le créez après ce point sans avertir l'interface utilisateur, cela ne fonctionnera pas
public ListView()
{
this.People = new ObservableCollection<Person>();
InitializeComponent();
this.DataContext = this;
this.People.Add(new Person() { Name = "John Doe", Age = 42, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "[email protected]" });
}
Mettez cette ligne après le code existant dans xaml.cs
this.DataContext = People;
et remplacez votre xaml par
ItemsSource="{Binding People}"
à
ItemsSource="{Binding}"