No MvvmCross, como faço para personalizar propriedades de ligação?
-
13-12-2019 - |
Pergunta
estou usando MvxBindableListView
para vincular um List<>
de objetos de dados para um ListView
.O layout que estou usando para as linhas tem vários TextView
S.Estou vinculando com sucesso o Text
propriedade de cada um deles a uma propriedade em meu objeto de dados, mas descobri que não consigo vincular a TextColor
já que essa propriedade não existe no Mono para Android TextView
é;em vez disso, você deve usar o SetTextColor()
método.Então, como posso vincular uma propriedade de objeto de dados a um método?!Abaixo está o código que tentei 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'}
}" />
Solução
Há um exemplo de adição de uma ligação bidirecional personalizada para "IsFavorite" no exemplo de Conferência - consulte:
- A ligação - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- a configuração de ligação em
FillTargetFactories
em https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
Este exemplo é explicado um pouco mais detalhadamente em: Ligações MVVMCross no Android
Para uma ligação personalizada unidirecional "origem ao destino", o código deve ser um pouco mais simples - você só precisa lidar com o SetValue
- e não precisa invocar FireValueChanged
em qualquer código de manipulação de eventos.
Para textColor, imagino que a ligação seria parecida com:
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 seria configurado com:
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)));
}
Observação:Eu não compilei este código de exemplo - quando você fazê-lo funcionar, volte e corrija este pseudocódigo :)