في MvvmCross كيف يمكنني القيام بخصائص الربط المخصصة

StackOverflow https://stackoverflow.com//questions/10700445

  •  13-12-2019
  •  | 
  •  

سؤال

انا استخدم MvxBindableListView لربط أ List<> من كائنات البيانات إلى أ ListView.يحتوي التخطيط الذي أستخدمه للصفوف على عدة TextViewس.لقد قمت بربط Text خاصية لكل من هذه الخصائص في كائن البيانات الخاص بي، لكنني وجدت أنه لا يمكنني الارتباط بها TextColor لأن هذه الخاصية غير موجودة في Mono For Android TextViewس؛بدلا من ذلك عليك استخدام SetTextColor() طريقة.فكيف يمكنني ربط خاصية كائن بيانات بطريقة ما؟!فيما يلي الرمز الذي حاولت استخدامه:

    <TextView
        android:id="@+id/MyValueTextView"
        android:layout_width="50dp"
        android:layout_height="20dp"
        android:layout_gravity="right"
        android:gravity="center_vertical|right"
        android:textSize="12sp"
        local:MvxBind="
        {
          'Text':{'Path':'MyValue','Converter':'MyValueConverter'},
          'TextColor':{'Path':'MyOtherValue','Converter':'MyOtherConverter'}
        }" />
هل كانت مفيدة؟

المحلول

يوجد مثال لإضافة ربط ثنائي الاتجاه مخصص لـ "IsFavorite" في نموذج المؤتمر - راجع:

تم شرح هذا المثال بمزيد من التفصيل في: روابط MVVMCross في Android

بالنسبة للربط المخصص "من المصدر إلى الهدف" أحادي الاتجاه، يجب أن تكون التعليمات البرمجية أبسط قليلاً - ما عليك سوى التعامل مع SetValue - ولا تحتاج إلى الاستدعاء FireValueChanged في أي حال التعامل مع التعليمات البرمجية.


بالنسبة إلى textColor، أتخيل أن الارتباط سيبدو قليلاً كما يلي:

public class MyCustomBinding
    : MvxBaseAndroidTargetBinding
{
    private readonly TextView _textView;

    public MyCustomBinding(TextView textView)
    {
        _textView = textView;
    }

    public override void SetValue(object value)
    {
        var colorValue = (Color)value;
        _textView.SetTextColor(colorValue);
    }

    public override Type TargetType
    {
        get { return typeof(Color); }
    }

    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.OneWay; }
    }
}

وسيتم الإعداد مع:

    protected override void FillTargetFactories(MvvmCross.Binding.Interfaces.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);

        registry.RegisterFactory(new MvxCustomBindingFactory<TextView>("TextColor", (textView) => new MyCustomBinding(textView)));
    }

ملحوظة:لم أقم بتجميع رمز المثال هذا - عندما تعمل عليه، يرجى العودة وتصحيح هذا الرمز الزائف :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top