web-dev-qa-db-fra.com

WPF ListView Binding ItemsSource dans XAML

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?

14
David

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]" }); 
}
10
dkozl

Mettez cette ligne après le code existant dans xaml.cs

this.DataContext = People;

et remplacez votre xaml par

ItemsSource="{Binding People}" 

à

ItemsSource="{Binding}"
5
Arushi Agrawal