В MvvmCross как мне создать собственные свойства привязки

StackOverflow https://stackoverflow.com//questions/10700445

  •  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» — см.:

Этот пример объясняется немного дальше: Привязки 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)));
    }

Примечание:Я не компилировал этот пример кода — когда он заработает, пожалуйста, вернитесь и исправьте этот псевдокод :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top