Dans MvvmCross, comment créer des propriétés de liaison personnalisées
-
13-12-2019 - |
Question
j'utilise MvxBindableListView
lier un List<>
d'objets de données à un ListView
.La disposition que j'utilise pour les lignes comporte plusieurs TextView
s.J'ai réussi à lier le Text
propriété pour chacun d'eux à une propriété dans mon objet de données, mais j'ai constaté que je ne peux pas me lier à TextColor
car cette propriété n'existe pas dans Mono pour Android TextView
s ;à la place, vous devez utiliser le SetTextColor()
méthode.Alors, comment puis-je lier une propriété d’objet de données à une méthode ?!Ci-dessous le code que j'ai essayé d'utiliser :
<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'}
}" />
La solution
Il existe un exemple d'ajout d'une liaison bidirectionnelle personnalisée pour "IsFavorite" dans l'exemple de conférence - voir :
- la reliure - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- la configuration de la liaison dans
FillTargetFactories
dans https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
Cet exemple est expliqué un peu plus loin dans : Liaisons MVVMCross dans Android
Pour une liaison personnalisée unidirectionnelle « source-cible », le code devrait être un peu plus simple : il vous suffit de gérer le SetValue
- et je n'ai pas besoin d'invoquer FireValueChanged
dans tous les cas, gérer le code.
Pour textColor, j'imagine que la liaison ressemblerait un peu à :
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; }
}
}
et serait configuré avec :
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)));
}
Note:Je n'ai pas compilé cet exemple de code - lorsque vous le faites fonctionner, veuillez revenir et corriger ce pseudo-code :)