MvvmCross でカスタム バインド プロパティを実行するにはどうすればよいですか

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

  •  13-12-2019
  •  | 
  •  

質問

使っています MvxBindableListView バインドする List<> データオブジェクトから ListView. 。行に使用しているレイアウトにはいくつかあります TextViews.正常にバインドできています Text これらのそれぞれのプロパティをデータオブジェクトのプロパティにバインドできないことがわかりました TextColor そのプロパティは Mono For Android には存在しないため TextViews;代わりに、 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'}
        }" />
役に立ちましたか?

解決

Conference サンプルには、「IsFavorite」のカスタム双方向バインディングを追加する例があります。以下を参照してください。

この例については、次でもう少し詳しく説明します。 Android での MVVM クロス バインディング

一方向の「ソースからターゲットへ」のカスタム バインディングの場合、コードはもう少し単純になるはずです。処理する必要があるのは、 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