public void VerifyBaseMethodDisposeUnhooksBindings() { var view = new DummyView(); var vm = new DummyVm(); int called = 0; var binding = BindingCore.CreateBinding(view, vm, d => d.DummyProperty, (dummyView, s) => { dummyView.TextProperty = s; called++; }); called.ShouldBe(1); view.TextProperty.ShouldBe(vm.DummyProperty); vm.DummyProperty = "Random value"; called.ShouldBe(2); view.TextProperty.ShouldBe(vm.DummyProperty); binding.Dispose(); vm.DummyProperty = "Random value numer 2"; called.ShouldBe(2); view.TextProperty.ShouldNotBe(vm.DummyProperty); vm.DummyProperty = "Random value numer 3"; called.ShouldBe(2); view.TextProperty.ShouldNotBe(vm.DummyProperty); }
public void VerifyBaseMethodDisposeWhenReferenceIsLost() { var view = new DummyView(); var vm = new DummyVm(); int called = 0; BindingCore.CreateBinding(view, vm, d => d.DummyProperty, (dummyView, s) => { dummyView.TextProperty = s; called++; }); called.ShouldBe(1); vm.DummyProperty = "Random value"; called.ShouldBe(2); view = null; GC.Collect(); vm.DummyProperty = "Random value number 2"; called.ShouldBe(2); }
public static IBinding BindText <TModel>( this UITextView view, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(() => v.Text = value)); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; EventHandler handler = (sender, args) => { if (!Equals(view.Text, prop.GetValue(model))) { prop.SetValue(model, view.Text); } }; view.Changed += handler; return(binding.With(() => view.Changed -= handler)); }
public static IBinding BindDate <TModel>( this DateTimeElement view, TModel model, Expression <Func <TModel, DateTime> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(v, () => { if (v.DateValue != value) { v.DateValue = value; return(true); } return(false); })); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; Action <DateTimeElement> viewOnValueChanged = element => { if (!Equals(element.DateValue, prop.GetValue(model))) { prop.SetValue(model, element.DateValue); } }; view.DateSelected += viewOnValueChanged; return(binding.With(() => view.DateSelected -= viewOnValueChanged)); }
public static IBinding BindText <TModel>( this UITextField view, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(() => v.Text = value)); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; var observer = NSNotificationCenter.DefaultCenter.AddObserver( UITextField.TextFieldTextDidChangeNotification, notification => { if (notification.Object != view) { return; } if (!Equals(view.Text, prop.GetValue(model))) { prop.SetValue(model, view.Text); } }); return(binding.With(() => NSNotificationCenter.DefaultCenter.RemoveObserver(observer))); }
public static IBinding BindValue <TModel>( this BooleanElement view, TModel model, Expression <Func <TModel, bool> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => BindingIos.Apply( () => { if (v.Value != value) { v.Value = value; } })); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; EventHandler viewOnValueChanged = (sender, args) => { if (!Equals(view.Value, prop.GetValue(model))) { prop.SetValue(model, view.Value); } }; view.ValueChanged += viewOnValueChanged; return(binding.With(() => view.ValueChanged -= viewOnValueChanged)); }
public static IBinding BindValue <TModel>( this CheckBox view, TModel model, Expression <Func <TModel, bool> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply( () => { if (v.Checked != value) { v.Checked = value; } })); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; EventHandler <CompoundButton.CheckedChangeEventArgs> viewOnValueChanged = (sender, args) => { if (!Equals(view.Checked, prop.GetValue(model))) { prop.SetValue(model, view.Checked); } }; view.CheckedChange += viewOnValueChanged; return(binding.With(() => view.CheckedChange -= viewOnValueChanged)); }
public static IBinding Bind <TView, TModel, TValue>( this TView view, TModel model, Expression <Func <TModel, TValue> > getVal, Action <TView, TValue> setVal) where TView : Java.Lang.Object where TModel : INotifyPropertyChanged { return(BindingCore.CreateBinding(view, model, getVal, (v, val) => Apply(() => setVal(v, val)))); }
public static IBinding BindText <TModel>(this TextView textView, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { return(BindingCore.CreateBinding( textView, model, getVal, (v, value) => Apply(() => v.Text = value))); }
public static IBinding BindEnable <TModel>( this View view, TModel model, Expression <Func <TModel, bool> > getVal) where TModel : INotifyPropertyChanged { return(BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(() => v.Enabled = value))); }
protected internal override bool SetFieldImp(object key, object val) { if (BindingCore != null) { var rv = BindingCore.SetFieldFor(null, key, val); if (rv) { return(rv); } } return(TypeObjectWrapper.SetFieldImp(key, val)); }
public void VerifyBaseMethodThrowsIfGetValIsNotVmProperty() { DummyView view = new DummyView(); DummyVm vm = new DummyVm(); Should.Throw <ArgumentException>( () => BindingCore.CreateBinding(vm, vm, model => "1", (model, val) => model.DummyProperty = val)); var binding = BindingCore.CreateBinding(view, vm, model => model.DummyProperty, (model, val) => model.TextProperty = val); binding.ShouldNotBeNull(); }
public static IBinding BindText <TModel>( this UILabel view, TModel model, Expression <Func <TModel, string> > getVal, string format = "{0}") where TModel : INotifyPropertyChanged { return(BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(() => v.Text = string.Format(format, value)))); }
public Form1() { InitializeComponent(); this.ViewModel = new SampleViewModel { Value = 50, Multiplier = 1, Color = new PclColor(0, 0, 0) }; BindingCore.CreateBinding(this.sldValue, this.ViewModel, vm => vm.Value, (bar, val) => bar.Value = (int)val); this.sldValue.ValueChanged += (sender, args) => this.ViewModel.Value = this.sldValue.Value; BindingCore.CreateBinding(this.sldMultiplier, this.ViewModel, vm => vm.Multiplier, (bar, val) => bar.Value = (int)val); this.sldMultiplier.ValueChanged += (sender, args) => this.ViewModel.Multiplier = this.sldMultiplier.Value; BindingCore.CreateBinding( this.lblResult, this.ViewModel, vm => vm.Result, (lbl, val) => lbl.Text = $"Result: {val.ToString("F2")}"); BindingCore.CreateBinding(this.btnSubmit, this.ViewModel, vm => vm.CanSubmit, (btn, canSubmit) => btn.Enabled = canSubmit); BindingCore.CreateBinding( this, this.ViewModel, vm => vm.Color, (me, color) => me.BackColor = Color.FromArgb(color.Red, color.Green, color.Blue)); BindingCore.CreateBinding(this.sldRed, this.ViewModel, vm => vm.Color, (bar, color) => bar.Value = color.Red); this.sldRed.ValueChanged += (sender, args) => this.ViewModel.Color = new PclColor((byte)this.sldRed.Value, this.ViewModel.Color.Green, this.ViewModel.Color.Blue); BindingCore.CreateBinding(this.sldGreen, this.ViewModel, vm => vm.Color, (bar, color) => bar.Value = color.Green); this.sldGreen.ValueChanged += (sender, args) => this.ViewModel.Color = new PclColor(this.ViewModel.Color.Red, (byte)this.sldGreen.Value, this.ViewModel.Color.Blue); BindingCore.CreateBinding(this.sldBlue, this.ViewModel, vm => vm.Color, (bar, color) => bar.Value = color.Blue); this.sldBlue.ValueChanged += (sender, args) => this.ViewModel.Color = new PclColor(this.ViewModel.Color.Red, this.ViewModel.Color.Green, (byte)this.sldBlue.Value); }
public void VerifyBaseMethodThrowsIfInvokedWithNullParameters() { DummyView nullView = null; DummyView valueView = new DummyView(); DummyVm nullVm = null; DummyVm valueVm = new DummyVm(); Should.Throw <ArgumentNullException>( () => BindingCore.CreateBinding(nullView, valueVm, vm => vm.DummyProperty, (m, t) => m.TextProperty = t)); Should.Throw <ArgumentNullException>( () => BindingCore.CreateBinding(valueView, nullVm, vm => vm.DummyProperty, (m, t) => m.TextProperty = t)); Should.Throw <ArgumentNullException>( () => BindingCore.CreateBinding <DummyView, DummyVm, string>(valueView, valueVm, null, (m, t) => m.TextProperty = t)); Should.Throw <ArgumentNullException>( () => BindingCore.CreateBinding(valueView, valueVm, vm => vm.DummyProperty, null)); var binding = BindingCore.CreateBinding(valueView, valueVm, vm => vm.DummyProperty, (m, t) => m.TextProperty = t); binding.ShouldNotBeNull(); }
public void VerifyBaseMethodExecutesOnceAtCall() { var view = new DummyView(); var vm = new DummyVm(); int called = 0; called.ShouldBe(0); BindingCore.CreateBinding(view, vm, d => d.DummyProperty, (v, text) => { v.TextProperty = text; called++; }); called.ShouldBe(1); }
protected internal override object GetFieldImp(object key) { if (BindingCore != null) { string strkey = key.UnwrapDynamic <string>(); if ("___ol" == strkey) { return(BindingCore.CreateOverloadSelector(null)); } else if ("___ctor" == strkey) { return(ClrCallable.GetFromPool(BindingCore, null)); } var rv = BindingCore.GetFieldFor(null, key); if (rv != null) { return(rv); } } return(TypeObjectWrapper.GetFieldImp(key)); }
protected override void CreateBindings() { BindingCore.CreateBinding(this.ViewModel, this.ViewModel, vm => vm.Book, (vm, dto) => BindingIos.Apply(() => { var navItem = this.NavigationItem; if (navItem == null) { return; } navItem.Prompt = dto.Title; })).With(() => Debug.WriteLine("Disposing Title")); BindingCore.CreateBinding(this.ViewModel, this.ViewModel, vm => vm.PageIndex, (vm, index) => BindingIos.Apply(() => { var navItem = this.NavigationItem; if (navItem == null) { return; } navItem.Title = $"Side {index + 1}"; })).With(() => Debug.WriteLine("Disposing Page Counter")); }
public static IBinding BindText <TModel>( this StringElement view, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { return(BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply( v, () => { if (v.Value != value) { v.Value = value; return true; } return false; }))); }
public static IBinding BindText <TModel>(this EditText editText, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( editText, model, getVal, (v, value) => Apply(() => v.Text = value)); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; EventHandler <TextChangedEventArgs> viewOnValueChanged = (sender, args) => { if (!Equals(editText.Text, prop.GetValue(model))) { prop.SetValue(model, editText.Text); } }; editText.TextChanged += viewOnValueChanged; return(binding.With(() => editText.TextChanged -= viewOnValueChanged)); }
public void VerifyBaseMethodGetsInvokedWhenPropertyChanges() { var view = new DummyView(); var vm = new DummyVm(); int called = 0; BindingCore.CreateBinding(view, vm, d => d.DummyProperty, (dummyView, s) => { dummyView.TextProperty = s; called++; }); called.ShouldBe(1); vm.DummyProperty = "Random value"; called.ShouldBe(2); vm.DummyProperty = "Random value number 2"; called.ShouldBe(3); }
public static IBinding BindText <TModel>( this EntryElement view, TModel model, Expression <Func <TModel, string> > getVal) where TModel : INotifyPropertyChanged { var binding = BindingCore.CreateBinding( view, model, getVal, (v, value) => Apply(v, () => { if (v.Value != value) { v.Value = value; return(true); } return(false); })); var prop = (PropertyInfo)((MemberExpression)getVal.Body).Member; EventHandler viewOnValueChanged = (sender, args) => { if (!Equals(view.Value, prop.GetValue(model))) { prop.SetValue(model, view.Value); } }; view.Changed += viewOnValueChanged; view.NotifyChangedOnKeyStroke = true; return(binding.With(() => view.Changed -= viewOnValueChanged)); }
public CreateAccountViewController() : base(UITableViewStyle.Grouped, null, true) { this.ViewModel = new CreateAccountViewModel(); var eleAcceptTos = new BooleanElement("Accept", this.ViewModel.ToS); eleAcceptTos.BindValue(this.ViewModel, vm => vm.ToS); var eleFirstName = new EntryElement("First name", "Enter first name", this.ViewModel.FirstName); eleFirstName.BindText(this.ViewModel, vm => vm.FirstName); var eleLastName = new EntryElement("Last name", "Enter last name", this.ViewModel.LastName); eleLastName.BindText(this.ViewModel, vm => vm.LastName); var eleBirthday = new DateElement("Birthday", this.ViewModel.Birthday); eleBirthday.BindDate(this.ViewModel, vm => vm.Birthday); var btnLogin = new UIButton { BackgroundColor = UIColor.White, Frame = new CGRect(0, 0, UIScreen.MainScreen.Bounds.Width, 64) }; btnLogin.SetTitle("Create Account", UIControlState.Normal); btnLogin.SetTitleColor(UIColor.Green, UIControlState.Normal); btnLogin.SetTitleColor(UIColor.DarkGray, UIControlState.Disabled); btnLogin.BindEnable(this.ViewModel, vm => vm.ToS); btnLogin.TouchUpInside += (sender, args) => this.CreateAccount(); var eleUsername = new EntryElement("Login", "Enter desired login", this.ViewModel.Username); eleUsername.BindText(this.ViewModel, vm => vm.Username); var elePassword = new EntryElement("Password", "Enter desired password", this.ViewModel.Password, true); elePassword.BindText(this.ViewModel, vm => vm.Password); const string NavTitle = "Bindings"; this.Root = new RootElement(NavTitle) { new Section("Personal") { eleFirstName, eleLastName, eleBirthday }, new Section("Account") { eleUsername, elePassword }, new Section("Read the Terms of Service") { eleAcceptTos }, new Section { new UIViewElement(string.Empty, btnLogin, true) } }; Action <CreateAccountViewController, string> updateTitle = (c, text) => { if (this.NavigationItem == null) { return; } if (!string.IsNullOrEmpty(this.ViewModel.FirstName) && !string.IsNullOrEmpty(this.ViewModel.LastName)) { this.NavigationItem.Title = $"{this.ViewModel.FirstName} {this.ViewModel.LastName}"; } else { this.NavigationItem.Title = NavTitle; } }; BindingCore.CreateBinding(this, this.ViewModel, vm => vm.FirstName, updateTitle); BindingCore.CreateBinding(this, this.ViewModel, vm => vm.LastName, updateTitle); }