[英]MvvmCross - navigate to ViewModel with parameters 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 的值传递给该方法的方法。
然后,您需要通过覆盖FillTargetFactories
在Setup.cs
class 中注册您的自定义目标绑定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.