Xamarin.forms: [Peningkatan] Kontrol Repeater yang Dapat Diikat

Dibuat pada 27 Jan 2018  ·  55Komentar  ·  Sumber: xamarin/Xamarin.Forms

Alasan

Formulir saat ini tidak berisi kontrol yang menampilkan item dari sumber item terikat dalam wadah yang tidak dapat digulir.

Penerapan

Properti terlampir yang menargetkan Layout akan ditambahkan untuk mendukung ItemsSource dan ItemsTemplate . Mengatur properti ini akan menambahkan item template ke tata letak target.

public static class BindableLayout
{
    public static readonly BindableProperty ItemsSourceProperty =
        BindableProperty.Create("ItemsSource", typeof(IList), typeof(Layout), default(IList));

    public static readonly BindableProperty ItemTemplateProperty =
        BindableProperty.Create("ItemTemplate", typeof(DataTemplate), typeof(Layout);
}

ItemTemplate bertanggung jawab untuk mengubah objek di ItemsSource menjadi objek View .

Menyetel ItemsSource akan menghapus semua turunan yang ada dan memperbarui koleksi Children agar sesuai dengan sumbernya.

Kompatibilitas terbalik

Ini adalah properti baru, jadi kompatibilitas mundur mungkin tidak menjadi masalah.

Kesulitan: Sedang

F100 community-sprint enhancement ➕

Komentar yang paling membantu

Ini adalah umpan balik yang sangat bagus, kami akan menginternalisasikannya dan kembali dengan proposal baru.

Semua 55 komentar

Saya sudah cukup banyak menerapkan kontrol ini seperti yang didefinisikan. Kemungkinan hanya perlu beberapa penyempurnaan, pembersihan, dan tinjauan praktik terbaik.

Ini mendukung DataTemplate atau DataTemplateSelector. Itu juga dapat menangani ItemSource yang mengimplementasikan INotifyCollectionChanged untuk menambah/menghapus item sesuai kebutuhan alih-alih membangun kembali semua anak

Saya telah melihat basis kode Formulir untuk melihat cara terbaik memodifikasi kode saya untuk gaya, konvensi, dll.

Saya pikir melihat ListView akan menjadi contoh yang baik, yang membawa saya ke ItemsView dan TemplatedItemsList. Yang saya belum sepenuhnya mengerti cara kerjanya. Tetapi pertanyaan saya adalah, apakah fitur ini memerlukan semua kerumitan itu atau hanya menambahkan tampilan baru ke tata letak tumpukan untuk setiap item dalam koleksi terikat berdasarkan DataTemplate?

Solusi saya saat ini melakukan metode sederhana, yang tidak membuatnya berkinerja sangat baik untuk daftar item yang besar, yang bukan kasus penggunaan saya untuk itu.

Pikiran?

Ada jalur alternatif yang bisa ditempuh.

Saya menerapkan ItemsSource dan ItemTemplate sebagai properti terlampir yang dapat diterapkan ke Layout :

https://github.com/GalaxiaGuy/MobileLibraries/blob/master/XamarinForms.Layout/Layout.cs

Secara teknis versi itu tidak mendukung DataTemplateSelector tetapi saya telah mengimplementasikannya dalam versi di tempat lain.

(Ini menjadi rumit setelah baris 67 hanya untuk mendukung INotifyCollectionChanged ).

Saya juga berpikir ide kontrol "Repeater" yang terpisah tidak cukup dan kita dapat memiliki sesuatu yang lebih baik dari itu. "Repeater" bukanlah solusi yang tepat.

Saya membuat kontrol saya karena saya membutuhkan daftar tampilan sederhana yang tidak mengizinkan pemilihan dan pada saat itu saya tidak dapat menemukan cara untuk mencegah ListView melakukan pemilihan.

Properti terlampir adalah ide yang menarik, tetapi kami mungkin membutuhkan umpan balik dari Tim XF tentang rute itu.

I untuk satu adalah ide asli untuk memperluas StackLayout dan menambahkan 2 properti. Ini adalah bagaimana hal itu telah dilakukan dalam proyek-proyek saya sebelumnya. Tetap sederhana.

Kontrol Repeater adalah apa yang kami minta, dan banyak pengembang menyukai pendekatan ini, sesuai dengan forum evolusi. Jika kita membutuhkan sesuatu yang lebih dari sebuah Repeater, kita menggunakan ListView. Pendekatan ini juga memberi kita daftar horizontal yang mengagumkan :) Jika kita membutuhkan tampilan daftar horizontal, itu adalah PR yang berbeda.

@adamped Yang mana tepatnya 2 properti yang Anda sarankan untuk ditambahkan ke ListView? Apakah maksud Anda Tata Letak?
ListView sudah memiliki ItemsSource dan ItemTemplate.

Maaf, salah ketik. maksud saya StackLayout :)

@davidortinau - FYI yang ini belum ditetapkan untuk Anda.

Inilah RepeaterView yang saya gunakan yang sebagian besar merupakan yang berevolusi dengan beberapa penyesuaian lagi yang harus saya terapkan di sepanjang jalan

https://Gist.github.com/PureWeen/4bf4d8c2e384a11b34398dc23201a7cc

Ini mendukung templating dan telah bekerja untuk saya dengan uwp/ios/android

@davidortinau Kita dapat memiliki sesuatu yang lebih baik daripada hanya menambahkan kontrol yang baru saja diturunkan dari StackLayout . Kalau tidak, saya rasa tidak masuk akal untuk menambahkan Repeater berasal dari StackLayout .
Paling-paling, mungkin menambahkan beberapa properti terlampir ke Layout, seperti yang disarankan @GalaxiaGuy di atas.

Cara kerangka kerja XAML melakukan ini adalah dengan ItemsControl .
Inilah pendapat saya tentang ini https://github.com/andreinitescu/XFItemsControl/

Silakan lihat bagian terakhir di bagian bawah, saya membagikan beberapa masalah\bug di Formulir Xamarin yang saya temukan.

Saya siap menambahkan 2 properti langsung ke StackLayout, alih-alih kontrol terpisah, yang disebut repeater.

Namun ItemsControl, meskipun bagus, menurut saya perlu diskusi lebih lanjut atau peningkatan di luar ini. Kontrol StackLayout yang dapat diikat adalah yang diinginkan orang. Ini adalah solusi sederhana dasar untuk banyak masalah.

Mungkin ItemsControl harus menjadi kontrol tambahan yang terpisah, di luar peningkatan ini. Atau peningkatan lebih lanjut ke StackLayout? Either way, itu pikiran saya. Akan melihat apa yang diputuskan oleh tim XF.

@adamped Menambahkan properti ItemsSource dan ItemTemplate ke StackLayout bukanlah keputusan yang baik. Sebagai gantinya, mungkin tambahkan mereka sebagai properti terlampir, hanya untuk membuat semua orang senang.

Jika tidak, jika properti ini ditambahkan langsung ke StackLayout, haruskah ditambahkan ke kelas Layout lainnya juga? Mengapa tidak juga menambahkannya ke Grid? Bagaimana dengan AbsoluteLayout atau RelativeLayout? Mungkin menambahkannya ke Layout atau Layout<View> ?

Saya pribadi suka bagaimana Windows XAML melakukannya. Kelas panel (yaitu Layout dalam Formulir Xamarin) tidak memiliki ItemsSource dan ItemTemplate. Panel hanya memiliki satu tujuan: untuk memposisikan item. Ini membuatnya dapat digunakan kembali dan dapat dihubungkan ke kontrol lain.

Pikiran lain: Seperti yang saya sebutkan di readme proyek saya, Xamarin memiliki ItemsView yang dekat dengan ItemsControl di Windows XAML. Saya yakin ada alasan mengapa tim Xamarin memilih untuk menurunkan ListView dari ItemsView .

Menambahkannya ke StackLayout tidak berarti cocok untuk kontrol tata letak lainnya. Bagaimana cara kerjanya dengan Grid, ada beberapa kolom dan baris. Bagaimana cara kerjanya dengan Tata Letak Absolut atau Relatif? Aku bahkan tidak bisa melihat bagaimana itu akan berhasil.

StackLayout dirancang untuk menumpuk satu demi satu elemen. Itulah mengapa ItemsSource bekerja dengan baik, dan tidak masuk akal jika layout lain memiliki opsi ini.

Bagaimana cara kerjanya dengan Grid, ada beberapa kolom dan baris. Bagaimana cara kerjanya dengan Tata Letak Absolut atau Relatif? Aku bahkan tidak bisa melihat bagaimana itu akan berhasil.

Itu akan. Google sedikit untuk hal-hal seperti 'kontrol item dengan kisi'. Anda akan melihat hal-hal jadul bagaimana ItemsControl dalam kombinasi dengan kelas turunan Panel yang berbeda dapat menghasilkan hal-hal yang sangat menarik.

Ini akan memungkinkan memiliki beberapa hal yang sangat mengesankan dalam Formulir Xamarin terutama mengingat itu lintas platform, kode yang jika tidak akan membutuhkan banyak waktu untuk menulis dan memelihara secara asli.

Selain itu, di masa depan, seseorang bahkan dapat menulis kontrol seperti ListView - murni dalam Formulir Xamarin. Bayangkan Anda memiliki kontrol yang mengambil Tata Letak apa pun yang memungkinkan pemosisian item apa pun, tetapi juga memiliki properti seperti SelectedItem untuk dapat memilih item (ListView di Windows XAML berasal dari ItemsControl)

Masalah dengan Grid adalah karena kinerja, dan kemudian harus menyiapkan properti tambahan untuk mengontrol aliran item yang ditambahkan. Anda akan melihat dari Googling sedikit tentang ItemsSource dan Grid di Xamarin.Forms, ada banyak solusi, termasuk salah satu saya di mana saya melakukan ini. Ini bukan solusi terbaik untuk Grid.

StackLayout adalah satu-satunya kontrol yang masuk akal hanya dengan 2 properti ini. Memperluasnya ke kontrol lain, atau membuat Masalah ini menjadi sesuatu yang lebih kompleks daripada yang diminta, harus dilakukan dalam edisi terpisah. Orang yang mengalami masalah ini hanya menginginkan StackLayout dengan ItemsSource.

Meskipun saya tahu orang lain pasti menyukai ItemsControl dan solusi yang Anda berikan, saya percaya itu adalah kontrol yang sama sekali berbeda, untuk serangkaian persyaratan yang berbeda. Saya tidak meminta dan tidak banyak orang lain, untuk ItemsControl. Yang saya butuhkan untuk beberapa proyek terakhir saya, hanyalah ItemsSource dan DataTemplate pada StackLayout.

Orang yang mengalami masalah ini hanya menginginkan StackLayout dengan ItemsSource.

Ya, orang sering mengalaminya, termasuk saya sendiri, tetapi itu tidak berarti menambahkan properti langsung ke StackLayout adalah solusi yang baik dari perspektif kerangka kerja.
Hal-hal terlihat berbeda dari perspektif yang lebih luas, jika tidak, jika kita mulai menambahkan properti hanya untuk memenuhi kebutuhan mendesak kita, kita akan berakhir dengan kekacauan, dengan sedikit atau tanpa dapat digunakan kembali. Setidaknya ini pendapat pribadi saya.

Aspek lain adalah konvergensi ke XAML terpadu (Standar XAML). Saya cukup yakin properti itu tidak masuk akal di StackLayout, Anda hanya perlu melihat Windows XAML.

StackLayout adalah satu-satunya kontrol yang masuk akal hanya dengan 2 properti ini.

Bagi saya ini terdengar seperti kesimpulan yang terburu-buru.
Ya, tentu kita semua terkadang membutuhkan sumber item yang dapat diikat. Mengapa tidak menggunakan ListView? Mungkin keputusan yang lebih baik adalah memiliki properti di ListView, seperti IsSelectionEnabled ? Lebih baik daripada membuat kontrol Repeater atau menambahkan properti ke StackLayout dan itu berarti kita masih dapat memiliki virtualisasi .

Standar XAML memunculkan poin bagus. Itu mungkin alasan yang baik untuk menggunakan ItemsControl. Kita harus melihat apa sikap XF dalam hal ini.

Dan alasan kami tidak menggunakan ListView adalah karena ListView mengimplementasikan pengguliran. Kalau tidak, kami hanya akan menggunakan Listview. Tapi saya pikir itu menyoroti Anda mencari solusi untuk masalah yang berbeda. Kami hanya ingin daftar yang dapat diikat yang tidak secara otomatis menyertakan tampilan gulir.

Menambahkan kontrol Repeater baru atau hanya menambahkan properti ke StackLayout tidak menarik bagi saya. Itu pasti akan menyelesaikan masalah tetapi tidak peduli seberapa 'jelas' solusi ini, dari perspektif kerangka kerja, ada cara yang lebih baik yang akan menambah lebih banyak fleksibilitas pada kerangka kerja, jadi mengapa tidak melakukannya sekarang? Ini tidak akan jauh lebih rumit untuk diterapkan.
Lagi pula, apa masalahnya dengan ItemsControl yang sudah saya terapkan? Saya melihat kembali ke komentar dan satu-satunya hal yang dapat saya lihat adalah "Orang-orang ingin StackLayout yang dapat diikat". Tentu, tapi itu karena orang tidak tahu tentang ItemsControl :)

Aku tahu? Tapi Anda hanya mengulangi hal-hal sekarang. Seperti yang disebutkan, poin yang valid diangkat, kita harus menunggu tim XF menyelesaikan apa pun.

Ada poin bagus yang dibuat dua arah dalam masalah ini. Saya menyarankan agar kita mempertimbangkan yang berikut:

  1. Ada kebutuhan untuk daftar sederhana untuk menampilkan sejumlah kecil item templat, "Pengulang" seperti yang ditentukan memenuhi ini. Ini juga akan menjadi overhead yang sangat rendah dan namanya jelas menyiratkan bahwa itu bukan kontrol yang canggih.

  2. Kami membutuhkan "ItemsControl" "ListView" yang lebih baik, dll. Tapi ini adalah masalah yang jauh lebih besar dan memiliki dampak yang jauh lebih luas, oleh karena itu akan membutuhkan lebih banyak pemikiran dan lebih banyak masukan dari Tim XF. Saya ingin memiliki kontrol daftar performant yang dapat saya tampilkan 100-an item templat, tetapi ini harus menjadi proposal terpisah. Saya menduga banyak masalah yang kami miliki dengan ListView adalah karena diimplementasikan di platform individual yang disediakan "ListViews". Jadi kontrol berbasis XF murni mungkin merupakan solusi yang baik.

Tetapi tim XF telah meninjau permintaan ini dan jika mereka memposting peningkatan sebagai item pekerjaan di sini, mereka tampaknya bersedia untuk mempertimbangkannya. Jangan biarkan yang besar menghalangi jalan yang baik. Ada ruang untuk "Repeater" dan "ItemsControl".

Saya juga tidak suka ide menambahkan properti ini ke StackLayout, mereka termasuk dalam subkelas. Tata letak harus tata letak, tidak lebih.

Menanggapi beberapa komentar sebelumnya - kami jelas tidak khawatir tentang virtualisasi atau kinerja dengan ItemsSource sangat besar di sini. Ini secara eksplisit untuk menangani daftar kecil item templat.

Melihat ItemsControl Andrei, ada banyak hal yang disukai; itu lebih fleksibel daripada Repeater sederhana, dan akan sepele untuk menggunakannya sebagai Repeater (terutama karena defaultnya menggunakan StackLayout). Ini juga memiliki keuntungan karena sangat akrab dengan pengembang UWP/WPF.

TBH, jika kami dapat menggabungkan PR untuk ItemsControl dalam waktu dekat, saya akan dengan senang hati menutup Masalah ini karena saya _think_ ItemsControl memecahkan masalah yang ingin diselesaikan oleh Repeater. Apakah ada kasus penggunaan untuk Repeater yang tidak tercakup oleh ItemsControl?

Akan sepele untuk mengubah repeater yang sedang saya kerjakan untuk mengirimkan masalah ini agar tidak mewarisi dari StackPanel dan menggunakan tata letak apa pun yang disediakan (atau default ke StackLayout).

Saya pribadi menyukai solusi itu lebih baik daripada ide properti terlampir yang disarankan.

Kami dapat mengikuti pendekatan sederhana dengan tidak mengkhawatirkan virtualisasi atau kinerja pada daftar besar, tetapi hanya mendukung penggunaan tata letak apa pun. Kontrol selalu dapat ditingkatkan nanti untuk menangani daftar besar jika diperlukan.

@hartez - itu mencakup semua skenario yang kami minati. Senang karena ini ditutup dan diganti dengan ItemsControl. Tampaknya lebih baik memiliki 1 kontrol yang memecahkan banyak masalah pada saat yang bersamaan.

@andreinitescu - apakah Anda senang menerapkan ini dalam PR, atau apakah Anda ingin orang lain mengambilnya? Apa pun yang terdaftar dengan tag F100 adalah bagian dari sprint komunitas yang kami semua coba selesaikan dalam 2 minggu ke depan.

fyi - @davidortinau - jika diperlukan penugasan kembali.

@hartez Saya membuat tiket untuk ItemsControl di sini #1743
@adamped Kita harus memutuskan terlebih dahulu bagaimana cara kerjanya dengan tepat.

Butuh umpan balik sebanyak mungkin dari semua orang.

Ini adalah umpan balik yang sangat bagus, kami akan menginternalisasikannya dan kembali dengan proposal baru.

Bisakah kita memindahkan yang ini dari "In Progress" ? Saya sarankan memiliki kolom yang disebut "Dalam diskusi" atau sesuatu dengan masalah yang sedang dibahas oleh tim. Kalau tidak, semuanya akan gagal selamanya seperti di Bugzilla.

@hartez @adamped Kami meluncurkan BindableStackLayout beberapa waktu lalu. Mudah digunakan, bekerja dengan baik di semua platform dan ada dalam rangkaian 'inti' kontrol tata letak XF non-pabrik kami.

BindableStackLayout

Ini adalah umpan balik yang sangat bagus, kami akan menginternalisasikannya dan kembali dengan proposal baru.

@jassmith Sudah 5 bulan,

@mattrichnz BindableStackLayout Anda persis seperti yang saya lakukan dan rencanakan untuk lakukan untuk fitur ini sampai

@jassmith Ada kabar? terakhir kali pada bulan Januari Anda mengatakan Anda sedang mendiskusikannya dengan tim Anda

IMHO, ListView seharusnya didasarkan pada kontrol ini dan mewarisi dari ini (#1743) seperti di UWP dan WPF (mewarisi dari ItemsControl ).
Ini mungkin hal terpenting yang tidak dimiliki XF, membawa frustrasi ke level teratas.
Selain itu ListView dibuat dengan masalah penglihatan yang luar biasa, sehingga tidak mendukung tata letak horizontal, penyetelan halus pemilihan, ukuran ke konten, ukuran ruang, dan masalah utama lainnya.
Lihat #1727, #2531, dan #2723.

Bagaimanapun, kurangnya ItemsControl dan/atau horizontal ListView sangat menyakitkan!
Xamarin memiliki fiksasi unik untuk membiaskan segala sesuatu ke arah seluler dan sepenuhnya mengabaikan hal lain. Waktu telah berlalu dan kami ingin mulai menggunakan Xamarin untuk layar yang lebih besar juga, dan juga untuk desktop.
Kurangnya dukungan horizontal, kontrol keyboard dan mouse yang lebih baik benar-benar menjengkelkan!

Selain itu, berbicara tentang ini, mungkin sudah saatnya kita menyingkirkan sel dan menempatkan konten langsung ke DataTemplate s seperti di WPF/UWP?

ping @jassmith lagi ... banyak orang @hartez @StephaneDelcroix 🤞 :)

@mattrichnz Saya tahu ada banyak kontrol di luar sana dan saya juga punya kontrol sendiri, masalahnya adalah tidak satupun dari mereka memiliki dukungan resmi dan pengujian yang tepat dan Anda menghabiskan waktu berhari-hari untuk menemukan yang tepat sampai Anda menyadari bahwa membuat sendiri adalah yang terbaik dan paling dapat diandalkan . Ini harus berhenti. Ini bukan PHP wild west, ini .NET di sini. Ini adalah liga Microsoft. Hal-hal ini harus ada di dalam kotak.

Ingin memiliki item yang dapat diikat di StackLayout, atau setidaknya tampilan pengulang.
Upvoting untuk Peningkatan ini!

Ini adalah umpan balik yang sangat bagus, kami akan menginternalisasikannya dan kembali dengan proposal baru.

Hai @jassmith
Sudah hampir 6 bulan sekarang... Bisakah Anda berbagi beberapa pemikiran? Xamarin Forms sangat membutuhkan beberapa alternatif untuk ListView ...

Terima kasih.

Benarkah tidak ada orang dari Xamarin Forms yang mendapat pemberitahuan tentang ini? @hartez @StephaneDelcroix @rmarinho @samhouts ?

Kami ingin melihat di mana ListView2 mendarat sebelum mendorong spesifikasi ini ke depan. Ini berisi banyak komponen yang dibutuhkan yang sama dan akan lebih baik untuk menghindari duplikasi mereka.

Apa itu "ListView2"?

Sesuatu yang akan kami pamerkan lebih detail segera.

Oke, terima kasih, semoga ada sesuatu yang berhasil di akhir 2018 :)

@jassmith tolong beri tahu saya itu tidak akan disebut ListView2...

Itu tidak akan disebut ListView2

Aku tahu. Ini akan disebut ListViewEx atau TheRealListView

Saya berharap konsep 'sel' akan hilang. Ide bodoh pada intinya. Seharusnya hanya 'Konten' seperti WPF/UWP/Silverlight/Avalonia/Uno.

@jassmith sekarang spesifikasi untuk ListView2 alias TheRealListView, alias CollectionView keluar ... satu hal yang saya tidak perhatikan adalah kemampuan untuk tidak menggulir ... itu cukup banyak salah satu fitur utama dari RepeaterView yang kebanyakan dari kita miliki diimplementasikan dan mengapa biasanya mewarisi dari StackLayout. Kekhawatiran saya adalah bahwa ini akan mengarah pada perilaku yang tidak diinginkan. Misalnya dengan konsep RepeaterView, saya dapat menyarangkan RepeaterView di dalam RepeaterView karena saya mengontrol di mana ScrollView berada, saya tidak berakhir dengan gulungan bersarang. Saya tahu Anda telah vokal tentang orang-orang yang melanggar virtualisasi ketika mereka membuat ListView di dalam ListView....

@dansiegel Jika CollectionView ternyata mengimplementasikan seperti yang saya bayangkan, itu akan bekerja seperti bagaimana ItemsControl bekerja bersama dengan StackPanel di Windows XAML. Yang seharusnya menjawab pertanyaan Anda tentang pengguliran. Lihat komentar saya di sini . Seperti yang saya sebutkan di sana, CollectionView seharusnya tidak memiliki pemilihan item atau pengguliran atau EmptyView, Ini harus berfungsi dan sesederhana ItemsControl. Kemampuan itu harus dimasukkan ke dalam kelas turunan, yang saya sarankan untuk dipanggil seperti ListCollectionView (mirip dengan ListView di Windows XAML)

Saya berharap konsep 'sel' akan hilang. Ide bodoh pada intinya. Seharusnya hanya 'Konten' seperti WPF/UWP/Silverlight/Avalonia/Uno.

Saya pikir ViewCell seharusnya menjadi DataTemplate, yang tampaknya akan didasarkan pada spesifikasi
usul

Ini bagus.
Apakah ada rencana untuk FlexRepeater juga? Maksud saya, sama seperti ini tetapi mewarisi dari FlexLayout alih-alih StackLayout ? Pikirkan keduanya akan diterima dengan baik di XF.

ItemsSource dan ItemTemplate harus dilampirkan pada properti yang dapat diikat, sehingga dapat diterapkan ke Grid, StackLayout, Flex, ...

Saya telah memperbarui spesifikasi yang diusulkan untuk mencerminkan saran properti terlampir dari GalaxiaGuy dan StephaneDelcroix.

RE: https://github.com/xamarin/Xamarin.Forms/issues/1718#issuecomment -394780832

Setelah mempertimbangkan dengan cermat, CollectionView akan _tidak_ membahas skenario dari proposal ini: https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -424413234

Jadi proposal ini kembali ke meja.

@hartez Typo pada spesifikasi yang diperbarui, kedua properti yang dapat ItemTemplate . :)

@hartez Typo pada spesifikasi yang diperbarui, kedua properti yang dapat ItemTemplate . :)

Oh! Terima kasih, diperbaiki.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat