Xamarin.forms: عرض محتوى نماذج Xamarin (تحكم المستخدم) غير ملزم داخل ListView

تم إنشاؤها على ١٥ مايو ٢٠١٨  ·  3تعليقات  ·  مصدر: xamarin/Xamarin.Forms

وصف

هناك ListView مرتبطة بسلسلة ObservableCollection. عرض القائمة يحتوي على تصنيف واحد و ContentView واحد (لا يحتوي إلا على تسمية). كلاهما مرتبط بنفس المجموعة.

أيضًا ، هناك زر يقوم بإنشاء بعض البيانات العشوائية للمجموعة.

المشكلة هي عندما أقوم بتشغيل التطبيق والنقر على زر إنشاء بيانات ، يتم تحديث التسمية ولكن ليس ContentView.

خطوات التكاثر

  1. افتح VS 2017 وأنشئ مشروع Xamarin Forms فارغًا جديدًا (قياسي)
  2. في MainPage.xaml ضع StackLayout باستخدام زر وعرض قائمة
  3. قم بتعيين DataTemplate الخاص بـ Listview على ViewCell الذي يحتوي على تسمية واحدة وعرض ContentView واحد (سننشئه أدناه). اربط خاصية Text بعناصر ObservableCollection.
  4. في MainPage.xaml.cs قم بإنشاء Observalbeخاصية
  5. في المنشئ ، قم بتهيئة المجموعة المرصودة ببعض القيم العشوائية وقم بتعيين سياق الربط على هذا.
  6. اشترك في النقر على الزر وقم بتعيين بعض القيم العشوائية إلى المجموعة المرصودة في كل مرة يتم فيها الضغط على الزر.
  7. قم بإنشاء ContentView (xaml) الجديد المستخدم أعلاه ، وضع تسمية بداخله مرتبطة بخاصية Text
  8. في xaml.cs قم بإنشاء نص خاصية قابل للربط.
  9. أو يمكنك ببساطة فك ضغط الحل المرفق وفتحه في VS 2017 (15.7.1)
    TestSample.zip
  10. تشغيل في Android ، وانقر على زر إنشاء.
  11. لاحظ أن النص المرتبط بالتسمية يتغير ، لكن النص المرتبط بـ ContentView لا يتغير.

سلوك متوقع

يجب أيضًا تغيير التسمية داخل طريقة عرض المحتوى.

السلوك الفعلي

تظل التسمية داخل طريقة عرض المحتوى كما هي

معلومات اساسية

  • الإصدار الذي يحتوي على الإصدار: 4.10.0.442
  • آخر إصدار جيد معروف:
  • IDE: VS 2017 (15.7.1)
  • الأطر المستهدفة للمنصة:

    • iOS:

    • أندرويد: 8.3.0.19

    • UWP:

  • إصدار مكتبة دعم Android:
  • حزم نوجيت:
    Xamarin. الأشكال
    NETStandard.Library

  • الأجهزة المتأثرة:

لقطات

رابط الاستنساخ

https://github.com/AppGrate/ListViewBindingIssue

question

التعليق الأكثر فائدة

عمل

this.BindingContext = this;

في MagicBox.xaml.cs يفرض BindingContext على الكائن الحالي. هذا يعني أيضًا أن BindingContext من الأصل لم يعد موروثًا.

لجعله يعمل ، قم بتغيير الكود الخاص بك خلف إلى

    [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 ();
        }
    }

و xaml الخاص بك

<?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>

ال 3 كومينتر

تم طرح سؤال على Stackoverflow قبل أسبوع - https://stackoverflow.com/questions/50211197/xamarin-forms-user-control-binding-inside-listview

عمل

this.BindingContext = this;

في MagicBox.xaml.cs يفرض BindingContext على الكائن الحالي. هذا يعني أيضًا أن BindingContext من الأصل لم يعد موروثًا.

لجعله يعمل ، قم بتغيير الكود الخاص بك خلف إلى

    [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 ();
        }
    }

و xaml الخاص بك

<?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>

شكرًا StephaneDelcroix ، لقد

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات