في MvvmCross كيف يمكنني القيام بخصائص الربط المخصصة
-
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" في نموذج المؤتمر - راجع:
- الترابط - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- إعداد الربط في
FillTargetFactories
في https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
تم شرح هذا المثال بمزيد من التفصيل في: روابط 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)));
}
ملحوظة:لم أقم بتجميع رمز المثال هذا - عندما تعمل عليه، يرجى العودة وتصحيح هذا الرمز الزائف :)