В MvvmCross как мне создать собственные свойства привязки
-
13-12-2019 - |
Вопрос
Я использую MvxBindableListView
связать List<>
объектов данных в ListView
.Макет, который я использую для строк, имеет несколько TextView
с.Я успешно связываю Text
для каждого из них к свойству в моем объекте данных, но я обнаружил, что не могу привязаться к TextColor
поскольку этого свойства не существует в Mono для Android TextView
с;вместо этого вы должны использовать SetTextColor()
метод.Итак, как я могу привязать свойство объекта данных к методу?!Ниже приведен код, который я пытался использовать:
<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'}
}" />
Решение
В примере конференции приведен пример добавления пользовательской двусторонней привязки для «IsFavorite» — см.:
- переплет - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Bindings/FavoritesButtonBinding.cs
- настройка привязки в
FillTargetFactories
в https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Setup.cs
Этот пример объясняется немного дальше: Привязки MVVMCross в Android
Для односторонней пользовательской привязки «источник-цель» код должен быть немного проще — вам нужно только обрабатывать SetValue
- и не нужно вызывать FireValueChanged
в любом коде обработки событий.
Я предполагаю, что для textColor привязка будет выглядеть примерно так:
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; }
}
}
и будет настроен с помощью:
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)));
}
Примечание:Я не компилировал этот пример кода — когда он заработает, пожалуйста, вернитесь и исправьте этот псевдокод :)