Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }
Example #4
0
        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));
        }
Example #5
0
        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)));
        }
Example #6
0
        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));
        }
Example #7
0
        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));
        }
Example #8
0
 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))));
 }
Example #9
0
 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)));
 }
Example #10
0
 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)));
 }
Example #11
0
 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));
 }
Example #12
0
        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();
        }
Example #13
0
 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))));
 }
Example #14
0
        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);
        }
Example #15
0
        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();
        }
Example #16
0
        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);
        }
Example #17
0
 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"));
 }
Example #19
0
 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;
     })));
 }
Example #20
0
        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));
        }
Example #21
0
        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);
        }
Example #22
0
        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);
        }