1

MvvmCross フレームワークで構築されたクロス プラットフォーム Xamarin アプリでは、Android .axml レイアウトで ToggleButton ウィジェットを使用しています。次のバインド構文を使用して、コンバーターを使用して、Checked プロパティをビュー モデル プロパティにバインドしました。

Checked MarketBuySellViewModel.Direction, Converter=DirectionBool, ConverterParameter='Sell'

すべてがうまく機能します。iOS 側では、Selected プロパティを使用して、UIButton を ToggleButton として使用できるようです。これは、次のバインディングが iOS で必要なものを達成する必要があることを意味します。

set.Bind (SellButton).For(b => b.Selected).To (vm => vm.MarketBuySellViewModel.Direction).WithConversion("DirectionBool", "Sell");

アプリケーションの出力にバインド エラーは表示されませんが、バインド自体は機能していないようです。ボタンをクリックしても、Direction プロパティは設定されず、方向を別の値に設定しても、UIButton の Selected プロパティは設定されません。

カスタム バインディングを作成する必要がありますか、それともバインディングの設定が間違っているだけですか?

また、UISegmentedControl を使用して同じ効果を達成しようとしました。このコントロールへのバインディングは MvvmCross でサポートされていますか? ソースコードにそれへの参照はありません。これは、カスタム バインディングも作成する必要があるということですか?

4

2 に答える 2

1

他の方の参考になるかもしれませんので、私の経験をシェアします。UISegmentedControl.SelectedSegment プロパティを ViewModel に双方向バインディングする必要がありました。一方向入札 (ViewModel => View) はデフォルトで機能します。UISegmentedControl をサブクラス化するために、Stuart によって提案されたソリューションを適切に利用できませんでした。リンカーが新しいカスタム コントロール コードを盗まないように注意しましたが、あまり役に立ちませんでした。したがって、完全に実行可能なソリューションは、MvxPropertyInfoTargetBinding を使用するソリューションです。これが私にとって問題なく機能するコードです:

public class MvxUISegmentedControlSelectedSegmentTargetBinding : MvxPropertyInfoTargetBinding<UISegmentedControl>
{
    public MvxUISegmentedControlSelectedSegmentTargetBinding(object target, PropertyInfo targetPropertyInfo)
        : base(target, targetPropertyInfo)
    {
        this.View.ValueChanged += HandleValueChanged;
    }

    private void HandleValueChanged(object sender, System.EventArgs e)
    {
        var view = this.View;
        if (view == null)
        {
            return;
        }
        FireValueChanged(view.SelectedSegment);
    }

    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.TwoWay; }
    }

    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);
        if (isDisposing)
        {
            var view = this.View;
            if (view != null)
            {
                view.ValueChanged -= HandleValueChanged;
            }
        }
    }
}

public class Setup : MvxTouchSetup
{
    ...
    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        registry.RegisterPropertyInfoBindingFactory(typeof(MvxUISegmentedControlSelectedSegmentTargetBinding), typeof(UISegmentedControl), "SelectedSegment");
    }
}
于 2014-11-04T08:06:31.217 に答える