Xamarin.forms: Xamarin Forms Tampilan Konten (Kontrol Pengguna) tidak mengikat di dalam ListView

Dibuat pada 15 Mei 2018  ·  3Komentar  ·  Sumber: xamarin/Xamarin.Forms

Keterangan

Ada ListView yang diikat ke ObservableCollection string. Listview memiliki satu label dan satu ContentView (tidak berisi apa-apa selain label). Keduanya terikat pada koleksi yang sama.

Juga, ada tombol yang menghasilkan beberapa data acak untuk koleksi.

Masalahnya adalah ketika saya menjalankan aplikasi dan mengklik tombol Hasilkan Data, label akan diperbarui tetapi bukan ContentView.

Langkah-langkah untuk Reproduksi

  1. Buka VS 2017 dan buat proyek kosong Xamarin Forms baru (standar)
  2. Di MainPage.xaml Tempatkan StackLayout dengan tombol dan Tampilan Daftar
  3. Setel DataTemplate Listview ke ViewCell yang berisi satu Label dan satu ContentView (kita akan membuatnya di bawah). Ikat properti Text ke item ObservableCollection.
  4. Di MainPage.xaml.cs buat ObservalbeProperti
  5. Dalam konstruktor inisialisasi koleksi Observable dengan beberapa nilai acak dan atur konteks pengikatan ke ini.
  6. Berlangganan klik tombol dan tetapkan beberapa nilai acak ke Koleksi yang Dapat Diamati setiap kali tombol ditekan.
  7. Buat ContentView(xaml) baru yang digunakan di atas, dan tempatkan label di dalamnya yang diikat ke properti Text
  8. Di xaml.cs buat Teks Properti yang Dapat Diikat.
  9. Atau Anda cukup membuka zip dan membuka solusi terlampir di VS 2017 (15.7.1)
    TestSample.zip
  10. Jalankan di Android, dan klik tombol generate.
  11. Perhatikan teks yang diikat ke label berubah, namun teks yang diikat ke ContentView tidak berubah.

Perilaku yang Diharapkan

Label di dalam Tampilan Konten juga harus berubah.

Perilaku Sebenarnya

Label di dalam Tampilan Konten tetap sama

Informasi dasar

  • Versi dengan masalah: 4.10.0.442
  • Versi bagus yang terakhir diketahui:
  • IDE: VS 2017 (15.7.1)
  • Kerangka Target Platform:

    • iOS:

    • Android: 8.3.0.19

    • UWP:

  • Versi Pustaka Dukungan Android:
  • Paket Nuget:
    Xamarin.Forms
    NETStandard.Library

  • Perangkat yang Terpengaruh:

Tangkapan layar

Tautan Reproduksi

https://github.com/AppGrate/ListViewBindingIssue

question

Komentar yang paling membantu

sedang mengerjakan

this.BindingContext = this;

di MagicBox.xaml.cs memaksa BindingContext ke objek saat ini. Ini juga berarti bahwa BindingContext dari induk tidak lagi diwarisi.

untuk membuatnya berfungsi, ubah kode Anda di belakang menjadi

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MagicBox : ContentView
    {

        public static readonly BindableProperty TextProperty =
            BindableProperty.Create("Text", typeof(string), typeof(MagicBox), default(string));

        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public MagicBox ()
        {
            InitializeComponent ();
        }
    }

dan xaml Anda ke

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestSample.Controls.MagicBox"
             x:Name="box">
  <ContentView.Content>
      <Grid>
          <Label Text="{Binding Text, Source={x:Reference box}}" />
      </Grid>
  </ContentView.Content>
</ContentView>

Semua 3 komentar

sedang mengerjakan

this.BindingContext = this;

di MagicBox.xaml.cs memaksa BindingContext ke objek saat ini. Ini juga berarti bahwa BindingContext dari induk tidak lagi diwarisi.

untuk membuatnya berfungsi, ubah kode Anda di belakang menjadi

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MagicBox : ContentView
    {

        public static readonly BindableProperty TextProperty =
            BindableProperty.Create("Text", typeof(string), typeof(MagicBox), default(string));

        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public MagicBox ()
        {
            InitializeComponent ();
        }
    }

dan xaml Anda ke

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestSample.Controls.MagicBox"
             x:Name="box">
  <ContentView.Content>
      <Grid>
          <Label Text="{Binding Text, Source={x:Reference box}}" />
      </Grid>
  </ContentView.Content>
</ContentView>

Terima kasih @StephaneDelcroix , itu berhasil :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat