ObservableCollection

Последнее обновление: 14.04.2017

Как правило, привязка в элементах управления данными осуществляется не к стандартным спискам, а к объектам класса 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. Поэтому при добавлении данных новый элемент автоматически будет отображен в списке:

Добавление в ObservableCollection ObservableCollection в UWP

В случае, если бы мы использовали класс List, у нас бы не происходило обновление пользовательского интерфейса при добавлении объекта.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850