繁体   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