En MvvmCross, ¿cómo hago propiedades de enlace personalizadas?
-
13-12-2019 - |
Pregunta
estoy usando MvxBindableListView
para unir un List<>
de objetos de datos a un ListView
.El diseño que estoy usando para las filas tiene varios TextView
s.Estoy vinculando con éxito el Text
propiedad para cada uno de estos a una propiedad en mi objeto de datos, pero he descubierto que no puedo vincularme a TextColor
ya que esa propiedad no existe en Mono para Android TextView
s;en su lugar tienes que usar el SetTextColor()
método.Entonces, ¿cómo puedo vincular una propiedad de objeto de datos a un método?A continuación se muestra el código que intenté usar:
<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'}
}" />
Solución
Hay un ejemplo de cómo agregar un enlace bidireccional personalizado para "IsFavorite" en el ejemplo de la Conferencia; consulte:
- la Unión - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- la configuración de encuadernación en
FillTargetFactories
en https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
Este ejemplo se explica un poco más en: Enlaces MVVMCross en Android
Para un enlace personalizado unidireccional "fuente a destino", el código debería ser un poco más simple: solo necesita manejar el SetValue
- y no es necesario invocar FireValueChanged
en cualquier caso, manejo del código.
Para textColor, me imagino que el enlace se parecería un poco a:
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; }
}
}
y estaría configurado 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:No he compilado este código de ejemplo; cuando lo haga funcionar, regrese y corrija este pseudocódigo :)