[英]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.