سؤال

لدي الصف التالي

public class Car
{
   public Name {get; set;}
}

وأريد ربط هذا برمجياً بمربع نص.

كيف يمكنني فعل ذلك؟

التصوير في الظلام:

...
Car car = new Car();
TextEdit editBox = new TextEdit();
editBox.DataBinding.Add("Name", car, "Car - Name");
...

أحصل على الخطأ التالية

"لا يمكن ربط "الاسم" الخاص بعنصر التحكم الهدف.

ما الخطأ الذي أفعله وكيف يجب أن أفعل هذا؟أجد صعوبة في فهم مفهوم ربط البيانات بسبب تطوير الويب.

هل كانت مفيدة؟

المحلول

انت تريد

editBox.DataBindings.Add("Text", car, "Name");

المعلمة الأولى هي اسم الخاصية الموجودة في عنصر التحكم الذي تريد ربطه بالبيانات، والثانية هي مصدر البيانات، والمعلمة الثالثة هي الخاصية الموجودة في مصدر البيانات التي تريد الارتباط بها.

نصائح أخرى

دون النظر إلى بناء الجملة، أنا متأكد من أنه:

editBox.DataBinding.Add("Text", car, "Name");
editBox.DataBinding.Add("Text", car, "Name");

الوسيط الأول هو اسم خاصية التحكم، والثاني هو الكائن المراد ربطه، والأخير هو اسم خاصية الكائن التي تريد استخدامها كمصدر للبيانات.

أنت قريب جدًا من خط ربط البيانات

editBox.DataBinding.Add("Text", car, "Name");

هذه المعلمة الأولى هي خاصية كائن التحرير الخاص بك والذي سيكون مرتبطًا بالبيانات.المعلمة الثانية هي مصدر البيانات الذي ترتبط به والمعلمة الأخيرة هي خاصية مصدر البيانات الذي تريد الارتباط به.

ضع في اعتبارك أن ربط البيانات هو إحدى الطرق، لذلك إذا قمت بتغيير مربع التحرير، فسيتم تحديث كائن السيارة ولكن إذا قمت بتغيير اسم السيارة مباشرة، فلن يتم تحديث مربع التحرير.

يحاول:

editBox.DataBinding.Add( "Text", car", "Name" );

أعتقد أن

editBox.DataBindings.Add(new Binding("Text", car, "Name"));

يجب أن تفعل الخدعة.لم أجربه، لكن أعتقد أن هذه هي الفكرة.

أنت تحاول الارتباط بـ "اسم" عنصر التحكم TextEdit.يُستخدم الاسم للوصول إلى عنصر التحكم برمجيًا، ولا يمكن ربطه به.يجب أن تكون ملزمًا بنص عنصر التحكم.

ما يلي هو فئة عامة يمكن استخدامها كخاصية وتنفيذ INotifyPropertyChanged المستخدم بواسطة عناصر التحكم المرتبطة لالتقاط التغييرات في قيمة الخاصية.

public class NotifyValue<datatype> : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    datatype _value;
    public datatype Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Value"));
        }
    }

}

ويمكن التصريح بهذا الشكل:

public NotifyValue<int> myInteger = new NotifyValue<int>();

وتعيينها لمربع نص مثل هذا

Textbox1.DataBindings.Add(
    "Text", 
    this, 
    "myInteger.Value", 
    false, 
    DataSourceUpdateMode.OnPropertyChanged
);

.. حيث أن "النص" هو خاصية مربع النص، و"هذا" هو مثيل النموذج الحالي.

ليس من الضروري أن يرث الفصل فئة INotifyPropertyChanged.بمجرد الإعلان عن حدث من النوع System.ComponentModel.PropertyChangedEventHandler، سيتم الاشتراك في حدث تغيير الفئة بواسطة قاعدة بيانات عناصر التحكم

باستخدام بناء جملة C#4.6:

editBox.DataBinding.Add(nameof(editBox.Text), car, nameof(car.Name));

إذا كانت السيارة خالية، فسيفشل الكود أعلاه بطريقة أكثر وضوحًا من استخدام السلسلة الحرفية لتمثيل datamember ل car

إنه

 this.editBox.DataBindings.Add(new Binding("Text", car, "Name"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top