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}">
 </gridviewcolumn></gridviewcolumn></gridviewcolumn></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 = "[removed_email]" });
 this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[removed_email]" });
 this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "sammy.[removed_email]" }); 
} 
</person></person>

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

lvUsers.ItemsSource = this.People;

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

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

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

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

2 ответа

Если вы этого не сделаете, в 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 = "[removed_email]" });
 this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[removed_email]" });
 this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "sammy.[removed_email]" }); 
}
</person>


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

this.DataContext = People;

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

ItemsSource="{Binding People}"

to

ItemsSource="{Binding}"

licensed under cc by-sa 3.0 with attribution.