ObservableCollection

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

При работе со списком объектов мы можем столкнуться с проблемой добавления или удаления объектов в этом списке. Так, возьмем пример из прошлой темы и добавим в код визуального интерфейса пару кнопок, которые будут выполнять добавление и удаление:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="HelloApp.MainPage">
    <StackLayout>
        <Label Text="{Binding Source={x:Reference Name=phonesList}, Path=SelectedItem.Title}"
            FontSize="Large" />
        <ListView x:Name="phonesList"
              HasUnevenRows="True"
              ItemsSource="{Binding Phones}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <StackLayout>
                                <Label Text="{Binding Title}" FontSize="Large" />
                                <Label Text="{Binding Company}" />
                                <Label Text="{Binding Price}" />
                            </StackLayout>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <StackLayout Orientation="Horizontal" HorizontalOptions="Center" >
            <Button Clicked="AddItem" Text="Добавить" />
            <Button Clicked="RemoveItem" Text="Удалить" />
        </StackLayout>
    </StackLayout>
</ContentPage>

В файл кода C# добавим к странице обработчики кнопок:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace HelloApp
{
    public partial class MainPage : ContentPage
    {
        public List<Phone> Phones { get; set; }

        public MainPage()
        {
            InitializeComponent();
            Phones = new List<Phone>
            {
                new Phone { Title = "HTC U Ultra", Company = "HTC", Price = 36000 },
                new Phone {Title="Huawei P10", Company="Huawei", Price=35000 },
                new Phone {Title="LG G 6", Company="LG", Price=42000 },
                new Phone {Title="iPhone 7", Company="Apple", Price=52000 }
            };

            this.BindingContext = this;
        }
        // добавление объекта
        private void AddItem(object sender, EventArgs e)
        {
            Phones.Add(new Phone { Title = "Galaxy S8", Company = "Samsung", Price = 48000 });
        }
        // удаление выделенного объекта
        private void RemoveItem(object sender, EventArgs e)
        {
            Phone phone = phonesList.SelectedItem as Phone;
            if (phone != null)
            {
                Phones.Remove(phone);
                phonesList.SelectedItem = null;
            }
        }
    }

    public class Phone
    {
        public string Title { get; set; }
        public string Company { get; set; }
        public int Price { get; set; }
    }
}

В данном случае типом коллекции является стандартный класс List, который поддерживает добавление и удаление с помощью методов Add() и Remove(). Однако при запуске приложения, если мы будем нажимать на кнопки, то никаких изменений в ListView, который отображает данный список, мы не увидим. Хотя в реальности коллекция Phones будет изменяться. Более того, мы можем столкнуться с исключением.

Чтобы решить эту проблемы в качестве типа коллекции, как правило, используется не класс List, а класс ObservableCollection из пространства имен System.Collections.ObjectModel. За счет реализации интерфейса INotifyCollectionChanged при добавлении или удалении объектов в ObservableCollection автоматически будут изменяться все привязанные к этой коллекции объекты, в том числе и ListView.

Итак, изменим определение коллекции Phones:

public ObservableCollection<Phone> Phones { get; set; }
public MainPage()
{
    InitializeComponent();
    Phones = new ObservableCollection<Phone>
    {
        new Phone { Title = "HTC U Ultra", Company = "HTC", Price = 36000 },
        new Phone {Title="Huawei P10", Company="Huawei", Price=35000 },
        new Phone {Title="LG G 6", Company="LG", Price=42000 },
        new Phone {Title="iPhone 7", Company="Apple", Price=52000 }
    };
    this.BindingContext = this;
}

И теперь у нас не возникнет проблем с добавлением или удалением.

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