WPF ListView Binding ItemsSource в XAML

У меня есть простая страница XAML со списком ListView, определенная как

<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> 

В коде позади: -

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

}   

Если я установил ItemSource моего списка в код, расположенный вот так

lvUsers.ItemsSource = this.People;

он работает, и моя сетка отображается как ожидалось

Однако, если я удалю эту строку и попытаюсь связать ее в XAML

<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding People}">

он больше не работает.

Почему привязка в XAML не работает?

Ответ 1

Если вы этого не сделаете, в XAML, например, вам нужно установить DataContext для вашей привязки. Кроме того, поскольку свойство People не реализует INotifyPropertyChanged, вы можете создать этот список до InitializeComponent, по крайней мере, до того, как вы установите DataContext, чтобы убедиться, что список готов, когда оценивается привязка. Вы можете добавить к своему ObservableCollection позже, но если вы создадите его после этой точки без уведомления пользовательского интерфейса, он не будет работать

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

Ответ 2

Поместите эту строку после существующего кода в xaml.cs

this.DataContext = People;

и замените свой xaml на

ItemsSource="{Binding People}" 

to

ItemsSource="{Binding}"