Как правило, привязка в элементах управления данными осуществляется не к стандартным спискам, а к объектам класса ObservableCollection. Почему используется именно этот класс, а не список типа List? Потому что ObservableCollection уже реализует интерфейс INotifyPropertyChanged и поэтому может уведомлять элементы, которые применяют привязку, в результате чего обновляется не только сам объект ObservableCollection, но и привязанные к нему элементы интерфейса.
К примеру, возьмем проект из прошлой темы и изменим xaml-код страницы MainPage:
<Page x:Class="DataApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:DataApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <ListBox Name="phonesList" ItemsSource="{x:Bind Phones}" SelectionChanged="phonesList_SelectionChanged"> <ListBox.ItemTemplate> <DataTemplate x:DataType="local:Phone"> <StackPanel Margin="10"> <TextBlock FontSize="16" Text="{x:Bind Title}" HorizontalAlignment="Center" /> <TextBlock FontSize="16" Text="{x:Bind Company}" HorizontalAlignment="Center" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <StackPanel Grid.Row="1" Margin="15"> <TextBox Name="titleTextBox" PlaceholderText="Введите название" Margin="2" /> <TextBox Name="companyTextBox" PlaceholderText="Введите производителя" Margin="2" /> <Button Content="Сохранить" Click="Button_Click" Margin="3" /> </StackPanel> </Grid> </Page>
Здесь также идет привязка к свойству Phones, которое представляет коллекцию объектов Phone.
Кроме того, во второй строке грида определена форма для добавления данных.
Теперь изменим код в файле MainPage.xaml.cs следующим образом:
using System; using System.Collections.ObjectModel; using Windows.UI.Xaml.Controls; namespace DataApp { public sealed partial class MainPage : Page { public ObservableCollection<Phone> Phones { get; set; } public MainPage() { this.InitializeComponent(); Phones = new ObservableCollection<Phone> { new Phone {Id=1, Title="iPhone 6S", Company="Apple" }, new Phone {Id=2, Title="Lumia 950", Company="Microsoft" }, new Phone {Id=3, Title="Nexus 5X", Company="Google" }, }; } private async void phonesList_SelectionChanged(object sender, SelectionChangedEventArgs e) { Phone selectedPhone = (Phone)phonesList.SelectedItem; await new Windows.UI.Popups.MessageDialog($"Выбран {selectedPhone.Title}").ShowAsync(); } // обработчик кнопки private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { string title = titleTextBox.Text; string company = companyTextBox.Text; // добавление нового объекта Phones.Add(new Phone { Title = title, Company = company, Id = Phones.Count + 1 }); companyTextBox.Text= titleTextBox.Text = String.Empty; } } }
Теперь свойство Phones представляет объект ObservableCollection. Поэтому при добавлении данных новый элемент автоматически будет отображен в списке:
В случае, если бы мы использовали класс List, у нас бы не происходило обновление пользовательского интерфейса при добавлении объекта.