Bagikan melalui


Mengisi CollectionView dengan data

Telusuri sampel. Telusuri sampel

UI Aplikasi Multi-platform .NET (.NET MAUI) CollectionView mencakup properti berikut yang menentukan data yang akan ditampilkan, dan tampilannya:

  • ItemsSource, dari jenis IEnumerable, menentukan kumpulan item yang akan ditampilkan, dan memiliki nilai nulldefault .
  • ItemTemplate, dari jenis DataTemplate, menentukan templat yang akan diterapkan ke setiap item dalam kumpulan item yang akan ditampilkan.

Properti ini didukung oleh BindableProperty objek, yang berarti bahwa properti dapat menjadi target pengikatan data.

CollectionViewItemsUpdatingScrollMode menentukan properti yang mewakili perilaku pengguliran CollectionView ketika item baru ditambahkan ke dalamnya. Untuk informasi selengkapnya tentang properti ini, lihat Mengontrol posisi gulir saat item baru ditambahkan.

CollectionView mendukung virtualisasi data inkremental saat pengguna menggulir. Untuk informasi selengkapnya, lihat Memuat data secara bertahap.

Mengisi CollectionView dengan data

CollectionView diisi dengan data dengan mengatur propertinya ItemsSource ke koleksi apa pun yang mengimplementasikan IEnumerable. Secara default, CollectionView menampilkan item dalam daftar vertikal.

Penting

CollectionView Jika diperlukan untuk menyegarkan saat item ditambahkan, dihapus, atau diubah dalam koleksi yang mendasar, koleksi yang mendasar harus berupa IEnumerable koleksi yang mengirim pemberitahuan perubahan properti, seperti ObservableCollection.

CollectionView dapat diisi dengan data dengan menggunakan pengikatan data untuk mengikat propertinya ItemsSource ke IEnumerable koleksi. Di XAML, ini dicapai dengan Binding ekstensi markup:

<CollectionView ItemsSource="{Binding Monkeys}" />

Kode C# yang setara adalah:

CollectionView collectionView = new CollectionView();
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");

Dalam contoh ini, ItemsSource data properti mengikat ke Monkeys properti viewmodel yang terhubung.

Catatan

Pengikatan yang dikompilasi dapat diaktifkan untuk meningkatkan performa pengikatan data dalam aplikasi .NET MAUI. Untuk informasi selengkapnya, lihat Pengikatan yang dikompilasi.

Untuk informasi tentang cara mengubah CollectionView tata letak, lihat Menentukan tata letak CollectionView. Untuk informasi tentang cara menentukan tampilan setiap item di CollectionView, lihat Menentukan tampilan item. Untuk informasi selengkapnya tentang pengikatan data, lihat Pengikatan data.

Peringatan

CollectionView akan memberikan pengecualian jika ItemsSource diperbarui dari utas UI.

Tentukan tampilan item

Tampilan setiap item dalam CollectionView dapat ditentukan dengan mengatur CollectionView.ItemTemplate properti ke DataTemplate:

<CollectionView ItemsSource="{Binding Monkeys}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid Padding="10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Image Grid.RowSpan="2"
                       Source="{Binding ImageUrl}"
                       Aspect="AspectFill"
                       HeightRequest="60"
                       WidthRequest="60" />
                <Label Grid.Column="1"
                       Text="{Binding Name}"
                       FontAttributes="Bold" />
                <Label Grid.Row="1"
                       Grid.Column="1"
                       Text="{Binding Location}"
                       FontAttributes="Italic"
                       VerticalOptions="End" />
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
    ...
</CollectionView>

Kode C# yang setara adalah:

CollectionView collectionView = new CollectionView();
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");

collectionView.ItemTemplate = new DataTemplate(() =>
{
    Grid grid = new Grid { Padding = 10 };
    grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
    grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });

    Image image = new Image { Aspect = Aspect.AspectFill, HeightRequest = 60, WidthRequest = 60 };
    image.SetBinding(Image.SourceProperty, "ImageUrl");

    Label nameLabel = new Label { FontAttributes = FontAttributes.Bold };
    nameLabel.SetBinding(Label.TextProperty, "Name");

    Label locationLabel = new Label { FontAttributes = FontAttributes.Italic, VerticalOptions = LayoutOptions.End };
    locationLabel.SetBinding(Label.TextProperty, "Location");

    Grid.SetRowSpan(image, 2);

    grid.Add(image);
    grid.Add(nameLabel, 1, 0);
    grid.Add(locationLabel, 1, 1);

    return grid;
});

Elemen yang ditentukan dalam DataTemplate menentukan tampilan setiap item dalam daftar. Dalam contoh, tata letak dalam DataTemplate dikelola oleh Grid. Grid berisi Image objek, dan dua Label objek, yang semuanya mengikat properti Monkey kelas:

public class Monkey
{
    public string Name { get; set; }
    public string Location { get; set; }
    public string Details { get; set; }
    public string ImageUrl { get; set; }
}

Cuplikan layar berikut menunjukkan hasil templat setiap item dalam daftar:

Cuplikan layar CollectionView tempat setiap item di-template.

Tip

Menempatkan CollectionView di dalam VerticalStackLayout dapat menghentikan CollectionView pengguliran, dan dapat membatasi jumlah item yang ditampilkan. Dalam situasi ini, ganti VerticalStackLayout dengan Grid.

Untuk informasi selengkapnya tentang templat data, lihat Templat data.

Pilih tampilan item saat runtime

Tampilan setiap item dalam CollectionView dapat dipilih pada runtime, berdasarkan nilai item, dengan mengatur CollectionView.ItemTemplate properti ke DataTemplateSelector objek:

<ContentPage ...
             xmlns:controls="clr-namespace:CollectionViewDemos.Controls">
    <ContentPage.Resources>
        <DataTemplate x:Key="AmericanMonkeyTemplate">
            ...
        </DataTemplate>

        <DataTemplate x:Key="OtherMonkeyTemplate">
            ...
        </DataTemplate>

        <controls:MonkeyDataTemplateSelector x:Key="MonkeySelector"
                                             AmericanMonkey="{StaticResource AmericanMonkeyTemplate}"
                                             OtherMonkey="{StaticResource OtherMonkeyTemplate}" />
    </ContentPage.Resources>

    <CollectionView ItemsSource="{Binding Monkeys}"
                    ItemTemplate="{StaticResource MonkeySelector}" />
</ContentPage>

Kode C# yang setara adalah:

CollectionView collectionView = new CollectionView
{
    ItemTemplate = new MonkeyDataTemplateSelector { ... }
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");

Properti ItemTemplate diatur ke MonkeyDataTemplateSelector objek. Contoh berikut menunjukkan MonkeyDataTemplateSelector kelas:

public class MonkeyDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate AmericanMonkey { get; set; }
    public DataTemplate OtherMonkey { get; set; }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        return ((Monkey)item).Location.Contains("America") ? AmericanMonkey : OtherMonkey;
    }
}

Kelas MonkeyDataTemplateSelector menentukan AmericanMonkey dan OtherMonkey DataTemplate properti yang diatur ke templat data yang berbeda. Penimpaan OnSelectTemplate AmericanMonkey mengembalikan templat, yang menampilkan nama monyet dan lokasi teal, ketika nama monyet berisi "Amerika". Ketika nama monyet tidak berisi "Amerika", OnSelectTemplate penimpaan OtherMonkey mengembalikan templat, yang menampilkan nama monyet dan lokasi dengan perak:

Cuplikan layar pilihan templat item runtime CollectionView.

Untuk informasi selengkapnya tentang pemilih templat data, lihat Membuat DataTemplateSelector.

Penting

Saat menggunakan CollectionView, jangan pernah mengatur elemen akar objek Anda DataTemplate ke ViewCell. Ini akan mengakibatkan pengecualian dilemparkan karena CollectionView tidak memiliki konsep sel.

Menu konteks

CollectionView mendukung menu konteks untuk item data melalui SwipeView, yang mengungkapkan menu konteks dengan gerakan gesek. SwipeView adalah kontrol kontainer yang membungkus item konten, dan menyediakan item menu konteks untuk item konten tersebut. Oleh karena itu, menu konteks diimplementasikan untuk dengan CollectionView membuat SwipeView yang menentukan konten yang dibungkus SwipeView , dan item menu konteks yang diungkapkan oleh gerakan gesek. Ini dicapai dengan mengatur SwipeView sebagai tampilan akar dalam DataTemplate yang menentukan tampilan setiap item data dalam CollectionView:

<CollectionView x:Name="collectionView"
                ItemsSource="{Binding Monkeys}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <SwipeView>
                <SwipeView.LeftItems>
                    <SwipeItems>
                        <SwipeItem Text="Favorite"
                                   IconImageSource="favorite.png"
                                   BackgroundColor="LightGreen"
                                   Command="{Binding Source={x:Reference collectionView}, Path=BindingContext.FavoriteCommand}"
                                   CommandParameter="{Binding}" />
                        <SwipeItem Text="Delete"
                                   IconImageSource="delete.png"
                                   BackgroundColor="LightPink"
                                   Command="{Binding Source={x:Reference collectionView}, Path=BindingContext.DeleteCommand}"
                                   CommandParameter="{Binding}" />
                    </SwipeItems>
                </SwipeView.LeftItems>
                <Grid BackgroundColor="White"
                      Padding="10">
                    <!-- Define item appearance -->
                </Grid>
            </SwipeView>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

Kode C# yang setara adalah:

CollectionView collectionView = new CollectionView();
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");

collectionView.ItemTemplate = new DataTemplate(() =>
{
    // Define item appearance
    Grid grid = new Grid { Padding = 10, BackgroundColor = Colors.White };
    // ...

    SwipeView swipeView = new SwipeView();
    SwipeItem favoriteSwipeItem = new SwipeItem
    {
        Text = "Favorite",
        IconImageSource = "favorite.png",
        BackgroundColor = Colors.LightGreen
    };
    favoriteSwipeItem.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.FavoriteCommand", source: collectionView));
    favoriteSwipeItem.SetBinding(MenuItem.CommandParameterProperty, ".");

    SwipeItem deleteSwipeItem = new SwipeItem
    {
        Text = "Delete",
        IconImageSource = "delete.png",
        BackgroundColor = Colors.LightPink
    };
    deleteSwipeItem.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.DeleteCommand", source: collectionView));
    deleteSwipeItem.SetBinding(MenuItem.CommandParameterProperty, ".");

    swipeView.LeftItems = new SwipeItems { favoriteSwipeItem, deleteSwipeItem };
    swipeView.Content = grid;    
    return swipeView;
});

Dalam contoh ini, SwipeView konten adalah Grid yang menentukan tampilan setiap item di CollectionView. Item gesek digunakan untuk melakukan tindakan pada SwipeView konten, dan terungkap saat kontrol disusutkan dari sisi kiri:

Cuplikan layar item menu konteks CollectionView.

SwipeViewmendukung empat arah gesek yang berbeda, dengan arah gesek yang ditentukan oleh koleksi SwipeItems arah SwipeItems tempat objek ditambahkan. Secara default, item geser dijalankan saat diketuk oleh pengguna. Selain itu, setelah item gesek dijalankan, item geser disembunyikan dan SwipeView konten ditampilkan kembali. Namun, perilaku ini dapat diubah.

Untuk informasi selengkapnya tentang SwipeView kontrol, lihat SwipeView.

Tarik untuk menyegarkan

CollectionView mendukung penarikan untuk menyegarkan fungsionalitas melalui RefreshView, yang memungkinkan data ditampilkan untuk disegarkan dengan menarik ke bawah pada daftar item. RefreshView adalah kontrol kontainer yang menyediakan penarikan untuk menyegarkan fungsionalitas kepada anaknya, asalkan anak mendukung konten yang dapat digulir. Oleh karena itu, tarik ke refresh diimplementasikan untuk dengan CollectionView mengaturnya sebagai anak dari RefreshView:

<RefreshView IsRefreshing="{Binding IsRefreshing}"
             Command="{Binding RefreshCommand}">
    <CollectionView ItemsSource="{Binding Animals}">
        ...
    </CollectionView>
</RefreshView>

Kode C# yang setara adalah:

RefreshView refreshView = new RefreshView();
ICommand refreshCommand = new Command(() =>
{
    // IsRefreshing is true
    // Refresh data here
    refreshView.IsRefreshing = false;
});
refreshView.Command = refreshCommand;

CollectionView collectionView = new CollectionView();
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Animals");
refreshView.Content = collectionView;
// ...

Saat pengguna memulai refresh, ICommand yang ditentukan oleh Command properti dijalankan, yang harus me-refresh item yang ditampilkan. Visualisasi refresh ditampilkan saat refresh terjadi, yang terdiri dari lingkaran kemajuan animasi:

Cuplikan layar CollectionView pull-to-refresh.

Nilai RefreshView.IsRefreshing properti menunjukkan status saat ini dari RefreshView. Ketika refresh dipicu oleh pengguna, properti ini akan secara otomatis beralih ke true. Setelah refresh selesai, Anda harus mengatur ulang properti ke false.

Untuk informasi selengkapnya tentang RefreshView, lihat RefreshView.

Memuat data secara bertahap

CollectionView mendukung virtualisasi data inkremental saat pengguna menggulir. Ini memungkinkan skenario seperti memuat halaman data secara asinkron dari layanan web, saat pengguna menggulir. Selain itu, titik di mana lebih banyak data dimuat dapat dikonfigurasi sehingga pengguna tidak melihat ruang kosong, atau dihentikan dari pengguliran.

Peringatan

Jangan mencoba memuat data secara bertahap dalam CollectionView yang ada di StackLayout. Skenario ini akan menyebabkan perulangan tak terbatas terjadi di mana CollectionView akan terus berkembang.

CollectionView mendefinisikan properti berikut untuk mengontrol pemuatan data inkremental:

  • RemainingItemsThreshold, dari jenis int, ambang item yang belum terlihat dalam daftar di mana RemainingItemsThresholdReached peristiwa akan ditembakkan.
  • RemainingItemsThresholdReachedCommand, dari jenis ICommand, yang dijalankan ketika tercapai RemainingItemsThreshold .
  • RemainingItemsThresholdReachedCommandParameter, dari jenis object, yang merupakan parameter yang diteruskan ke RemainingItemsThresholdReachedCommand.

CollectionView juga mendefinisikan RemainingItemsThresholdReached peristiwa yang diaktifkan ketika CollectionView digulir cukup jauh sehingga RemainingItemsThreshold item belum ditampilkan. Kejadian ini dapat ditangani untuk memuat lebih banyak item. Selain itu, ketika RemainingItemsThresholdReached peristiwa diaktifkan, RemainingItemsThresholdReachedCommand dieksekusi, memungkinkan pemuatan data bertahap terjadi di viewmodel.

Nilai RemainingItemsThreshold default properti adalah -1, yang menunjukkan bahwa RemainingItemsThresholdReached peristiwa tidak akan pernah diaktifkan. Ketika nilai properti adalah 0, RemainingItemsThresholdReached peristiwa akan diaktifkan ketika item akhir dalam ItemsSource ditampilkan. Untuk nilai yang lebih besar dari 0, RemainingItemsThresholdReached peristiwa akan diaktifkan ketika ItemsSource berisi jumlah item yang belum digulir.

Catatan

CollectionView memvalidasi RemainingItemsThreshold properti sehingga nilainya selalu lebih besar dari atau sama dengan -1.

Contoh XAML berikut menunjukkan CollectionView yang memuat data secara bertahap:

<CollectionView ItemsSource="{Binding Animals}"
                RemainingItemsThreshold="5"
                RemainingItemsThresholdReached="OnCollectionViewRemainingItemsThresholdReached">
    ...
</CollectionView>

Kode C# yang setara adalah:

CollectionView collectionView = new CollectionView
{
    RemainingItemsThreshold = 5
};
collectionView.RemainingItemsThresholdReached += OnCollectionViewRemainingItemsThresholdReached;
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Animals");

Dalam contoh kode ini, RemainingItemsThresholdReached peristiwa diaktifkan ketika ada 5 item yang belum digulir ke, dan sebagai respons menjalankan OnCollectionViewRemainingItemsThresholdReached penanganan aktivitas:

void OnCollectionViewRemainingItemsThresholdReached(object sender, EventArgs e)
{
    // Retrieve more data here and add it to the CollectionView's ItemsSource collection.
}

Catatan

Data juga dapat dimuat secara bertahap dengan mengikat RemainingItemsThresholdReachedCommand implementasi ICommand dalam viewmodel.