簡體   English   中英

將 BEMCheckBox 綁定到 ViewModel 時出現問題 - MvvmCross,Xamarin.iOS

[英]Issue in Binding BEMCheckBox to ViewModel - MvvmCross, Xamarin.iOS

我是MvvmCross的新手,仍在弄清楚事情是如何完成的。 我正在將BEMCheckBox用於我開發的應用程序之一,我試圖將 BEMCheckBox 的“On”屬性綁定到 ViewModel。 不幸的是,它沒有按預期工作。

BEM復選框
Github: https://github.com/saturdaymp/XPlugins.iOS.BEMCheckBox
NuGet:星期六MP.XPlugins.iOS.BEMCheckBox
版本:1.4.3

Mvvm交叉
版本:6.4.2

這是我的觀點 Class

[MvxFromStoryboard("Main")]
[MvxRootPresentation(WrapInNavigationController = false)]
public partial class MyView : BaseView<MyViewModel>
{
    private BEMCheckBox CheckBox;

    public MyView(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        //add check box
        CheckBox = new BEMCheckBox(new CoreGraphics.CGRect(0, 0, 20, 20))
        {
            BoxType = BEMBoxType.Square,
            TintColor = UIColor.FromRGBA(0, 0, 0, 0.14f),
            OnFillColor = UIColor.FromRGB(42, 183, 202),
            OnCheckColor = UIColor.White,
            OnTintColor = UIColor.FromRGBA(0, 0, 0, 0.14f),
            OnAnimationType = BEMAnimationType.Bounce,
            OffAnimationType = BEMAnimationType.Bounce,
            On = false,
            CornerRadius = 0,
        };

        //CheckBoxContainerView is an UIView 
        CheckBoxContainerView.AddSubview(CheckBox);
        CheckBoxContainerView.BackgroundColor = UIColor.Clear;

        //Binding to View Model
        var set = this.CreateBindingSet<MyView, MyViewModel>();
        set.Bind(CheckBox).For(c => c.On).To(vm => vm.IsCheckBoxOn);
        set.Apply();
    }
}

這是我的 ViewModel Class

public class MyViewModel : BaseViewModel
{
    private bool _isCheckBoxOn;
    public bool IsCheckBoxOn
    {
        get => _isCheckBoxOn;
        set
        {
            SetProperty(ref _isCheckBoxOn, value);
            Console.WriteLine(_isCheckBoxOn);
        }
    }

    public MyViewModel : base()
    {
    }

    public override Task Initialize()
    {
        return base.Initialize();
    }
}

當我為 UISwitch 做同樣的事情時,它工作得很好。 任何幫助將不勝感激。

MvvmCross 包括許多開箱即用的目標綁定,UISwitch 就是其中之一。 有關完整列表,請參閱 MvvmCross 文檔中的“ 內置綁定”。

單向綁定(ViewModel -> View)

默認情況下,您可以創建一個綁定,從您的視圖 model 中為視圖上的屬性賦值,這稱為單向綁定。 只要類型匹配,該方法甚至適用於自定義第 3 方控件。

雙向綁定ViewModel -> View && View -> ViewModel

為了進行雙向綁定,MvvmCross 需要一個視圖機制來通知視圖 model 視圖的值已更改。 為此 MvvmCross 使用目標綁定。 請參閱 MvvCross 文檔以創建自定義目標綁定。


例子

請參閱 MvxUISwitchOnTargetBinding.cs 的MvxUISwitchOnTargetBinding.cs源代碼,其中顯示了它們如何綁定 UISwitch 控件和 On state。

public class MvxUISwitchOnTargetBinding : MvxTargetBinding<UISwitch, bool>
{
    private IDisposable _subscription;

    public MvxUISwitchOnTargetBinding(UISwitch target)
        : base(target)
    {
    }

    protected override void SetValue(bool value)
    {
        Target.SetState(value, true);
    }

    public override void SubscribeToEvents()
    {
        var uiSwitch = Target;
        if (uiSwitch == null)
        {
            MvxBindingLog.Error( "Error - Switch is null in MvxUISwitchOnTargetBinding");
            return;
        }
        _subscription = uiSwitch.WeakSubscribe(nameof(uiSwitch.ValueChanged), HandleValueChanged);
    }

    public override MvxBindingMode DefaultMode => MvxBindingMode.TwoWay;

    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);
        if (!isDisposing) return;
        _subscription?.Dispose();
        _subscription = null;
    }

    private void HandleValueChanged(object sender, EventArgs e)
    {
        FireValueChanged(Target.On);
    }
}

請注意調用FireValueChanged()方法的HandleValueChanged方法,這是將您要發送回綁定視圖 model 的值傳遞給該方法的方法。

然后,您需要通過覆蓋FillTargetFactoriesSetup.cs class 中注冊您的自定義目標綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM