Wie mache ich in MvvmCross benutzerdefinierte Bindungseigenschaften
-
13-12-2019 - |
Frage
Ich benutze MvxBindableListView
um eine zu binden List<>
von Datenobjekten zu einem ListView
.Das Layout, das ich für die Zeilen verwende, hat mehrere TextView
s.Ich bin erfolgreich binden die Text
eigenschaft für jede dieser Eigenschaften an eine Eigenschaft in meinem Datenobjekt, aber ich habe festgestellt, dass ich nicht binden kann TextColor
da diese Eigenschaft in Mono für Android nicht existiert TextView
s;stattdessen haben Sie das verwendet SetTextColor()
Methode.Wie kann ich also eine Datenobjekteigenschaft an eine Methode binden?!Unten ist der Code, den ich zu verwenden versucht habe:
<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'}
}" />
Lösung
Es gibt ein Beispiel für das Hinzufügen einer benutzerdefinierten 2-Wege-Bindung für "IsFavorite" im Konferenzbeispiel - siehe:
- verbindlich - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- der Bindungsaufbau in
FillTargetFactories
in https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
Dieses Beispiel wird in etwas weiter erläutert: MvvmCross-Bindungen in Android
Für eine Einweg-benutzerdefinierte "Quelle-zu-Ziel" -Bindung sollte der Code etwas einfacher sein - Sie müssen nur mit dem umgehen SetValue
- und muss nicht anrufen FireValueChanged
in jedem Fall Code für die Behandlung.
Für textColor würde ich mir vorstellen, dass die Bindung ein bisschen so aussehen würde:
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; }
}
}
und würde mit eingerichtet werden:
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)));
}
Beachten:Ich habe diesen Beispielcode nicht kompiliert - wenn er funktioniert, kommen Sie bitte zurück und korrigieren Sie diesen Pseudocode :)