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