In mvvmcross come faccio le proprietà BIND personalizzate
-
13-12-2019 - |
Domanda
Sto usando MvxBindableListView
per collegare un List<>
di oggetti dati a un ListView
.Il layout che sto usando per le righe ha diversi TextView
s.Implemente vincolando la proprietà Text
per ognuna di queste a una proprietà nel mio oggetto dati, ma ho scoperto che non posso legarmi a TextColor
in quanto tale proprietà non esiste in Mono per TextView
s Android;Invece hai usato il metodo SetTextColor()
.Quindi, come posso associare una proprietà di un oggetto dati a un metodo?!Di seguito è riportato il codice che ho provato ad usare:
<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'}
}" />
. Soluzione
C'è un esempio di aggiungere un legame personalizzato a 2 vie per "isfavorite" nel campione della conferenza - vedere:
- .
- il rilegatura - https://github.com/slodge/mvvmcross/blob/master/sample%20-%20CirroiousConference/Cirrious.conference.ui.Droid/bindings/favoritesbuttonbinding.cs
- L'impostazione di rilegatura in
FillTargetFactories
in https://github.com/slodge/mvvmcross/blob/master/sample%20-%20CirRiRousConference/Cirrious.conference.ui.droid/setup.cs
Questo esempio è spiegato un po 'più avanti in: MVVmCross Bindings in Android
Per un legame personalizzato "Source-to-Target" a senso unico, il codice dovrebbe essere un po 'più semplice: è solo necessario gestire il SetValue
- e non è necessario richiamare FireValueChanged
in qualsiasi codice di gestione degli eventi. .
.
Per Textcolor, immaginerei che il rilegatura sarebbe un po 'come:
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; }
}
}
.
e sarebbe configurato con:
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)));
}
.
Nota: non ho compilato questo codice di esempio - quando lo fai funzionare, per favore torna indietro e correggere questo pseudo-code :)