private static void RegisterDialogMembers(IBindingMemberProvider memberProvider)
        {
            memberProvider.Register(AttachedBindingMember.CreateMember <Element, object>(AttachedMemberConstants.Parent,
                                                                                         (info, element) => element.Parent ?? BindingExtensions.AttachedParentMember.GetValue(element, null),
                                                                                         (info, element, arg3) => BindingExtensions.AttachedParentMember.SetValue(element, arg3),
                                                                                         (info, element, arg3) => BindingExtensions.AttachedParentMember.TryObserve(element, arg3)));

            IBindingMemberInfo member = memberProvider.GetBindingMember(typeof(EntryElement), "Changed", true, false);

            if (member != null)
            {
                memberProvider.Register(AttachedBindingMember.CreateEvent <EntryElement>("ValueChanged",
                                                                                         (info, element, arg3) => member.TryObserve(element, arg3)));
            }

            memberProvider.Register(AttachedBindingMember.CreateEvent <StringElement>("Tapped",
                                                                                      (info, element, arg3) =>
            {
                var weakWrapper          = arg3.ToWeakWrapper();
                IDisposable unsubscriber = null;
                NSAction action          = () =>
                {
                    if (!weakWrapper.EventListener.TryHandle(weakWrapper.EventListener, EventArgs.Empty))
                    {
                        unsubscriber.Dispose();
                    }
                };
                unsubscriber = WeakActionToken.Create(element, action,
                                                      (stringElement, nsAction) => stringElement.Tapped -= nsAction);
                element.Tapped += action;
                return(unsubscriber);
            }));
        }
 public static void RegisterStringElementMembers()
 {
     BindingBuilderExtensions.RegisterDefaultBindingMember <StringElement>(nameof(StringElement.Value));
     MemberProvider.Register(AttachedBindingMember.CreateMember <StringElement, string>(nameof(StringElement.Value),
                                                                                        (info, element) => element.Value,
                                                                                        (info, element, arg3) =>
     {
         element.Value = arg3;
         element.Reload();
     }));
     MemberProvider.Register(AttachedBindingMember.CreateEvent(AttachedMembers.StringElement.TappedEvent,
                                                               (info, element, arg3) =>
     {
         var weakWrapper          = arg3.ToWeakWrapper();
         IDisposable unsubscriber = null;
         Action action            = () =>
         {
             if (!weakWrapper.EventListener.TryHandle(weakWrapper.EventListener, EventArgs.Empty))
             {
                 unsubscriber.Dispose();
             }
         };
         unsubscriber = WeakActionToken.Create(element, action,
                                               (stringElement, nsAction) => stringElement.Tapped -= nsAction);
         element.Tapped += action;
         return(unsubscriber);
     }));
 }
Exemple #3
0
        public static IDisposable ObserveProperty(DependencyObject src, DependencyProperty property, IEventListener listener)
        {
            listener = listener.ToWeakEventListener();
            var t = src.RegisterPropertyChangedCallback(property, listener.Handle);

            return(WeakActionToken.Create(src, property, t, (dp, p, token) => dp.UnregisterPropertyChangedCallback(p, token)));
        }
Exemple #4
0
 public static void RegisterDataGridViewMembers()
 {
     BindingBuilderExtensions.RegisterDefaultBindingMember(AttachedMembers.Object.ItemsSource.Override <DataGridView>());
     MemberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.Object.ItemsSource.Override <DataGridView>(),
                                                                (info, view) => view.DataSource as IEnumerable, (info, view, value) =>
     {
         view.DataSource = value;
         view.Refresh();
     }, nameof(DataGridView.DataSourceChanged)));
     MemberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.DataGridView.SelectedItem,
                                                                GetSelectedItemDataGridView, SetSelectedItemDataGridView, (info, view, arg3) =>
     {
         arg3 = arg3.ToWeakEventListener();
         EventHandler handler = null;
         handler = (sender, args) =>
         {
             var gridView = (DataGridView)sender;
             Action <DataGridView, IEventListener, EventHandler> action =
                 (dataGridView, listener, eventHandler) =>
             {
                 if (!listener.TryHandle(dataGridView, EventArgs.Empty))
                 {
                     dataGridView.CurrentCellChanged -= eventHandler;
                 }
             };
             //To prevent this exception 'Operation not valid because it results in a reentrant call to the SetCurrentCellAddressCore function'
             gridView.BeginInvoke(action, gridView, arg3, handler);
         };
         view.CurrentCellChanged += handler;
         return(WeakActionToken.Create(view, handler,
                                       (gridView, eventHandler) => gridView.CurrentCellChanged -= eventHandler));
     }));
 }
Exemple #5
0
 /// <summary>
 ///     Suspends the change notifications until the returned <see cref="IDisposable" /> is disposed.
 /// </summary>
 /// <returns>An instance of token.</returns>
 public virtual IDisposable SuspendNotifications()
 {
     if (Interlocked.Increment(ref _suspendCount) == 1)
     {
         OnPropertyChanged("IsNotificationsSuspended");
     }
     return(WeakActionToken.Create(this, @base => @base.EndSuspendNotifications()));
 }
 /// <summary>
 ///     Suspends the change notifications until the returned <see cref="IDisposable" /> is disposed.
 /// </summary>
 /// <returns>An instance of token.</returns>
 public virtual IDisposable SuspendNotifications()
 {
     if (Interlocked.Increment(ref _suspendCount) == 1)
     {
         OnPropertyChanged(new PropertyChangedEventArgs("IsNotificationsSuspended"));
     }
     return(WeakActionToken.Create(this, collection => collection.EndSuspendNotifications()));
 }
Exemple #7
0
        private static IDisposable ObserveTimePickerValue(IBindingMemberInfo bindingMemberInfo, TimePicker timePicker,
                                                          IEventListener arg3)
        {
            EventHandler <TimePicker.TimeChangedEventArgs> handler = arg3.ToWeakEventListener().Handle;

            timePicker.TimeChanged += handler;
            return(WeakActionToken.Create(timePicker, handler, (picker, eventHandler) => picker.TimeChanged -= eventHandler));
        }
        private static void RegisterDialogMembers(IBindingMemberProvider memberProvider)
        {
            BindingBuilderExtensions.RegisterDefaultBindingMember <Element>(nameof(Element.Caption));
            memberProvider.Register(AttachedBindingMember.CreateMember <Element, string>(nameof(Element.Caption),
                                                                                         (info, element) => element.Caption,
                                                                                         (info, element, arg3) =>
            {
                element.Caption = arg3;
                element.Reload();
            }));
            memberProvider.Register(AttachedBindingMember.CreateMember <Element, object>(AttachedMemberConstants.ParentExplicit,
                                                                                         (info, element) => element.Parent, null));

            BindingBuilderExtensions.RegisterDefaultBindingMember <EntryElement>(nameof(EntryElement.Value));
            IBindingMemberInfo member = memberProvider.GetBindingMember(typeof(EntryElement), nameof(EntryElement.Changed), true, false);

            if (member != null)
            {
                memberProvider.Register(AttachedBindingMember.CreateEvent <EntryElement>("ValueChanged",
                                                                                         (info, element, arg3) => member.TryObserve(element, arg3)));
            }

            BindingBuilderExtensions.RegisterDefaultBindingMember <StringElement>(nameof(StringElement.Value));
            memberProvider.Register(AttachedBindingMember.CreateMember <StringElement, string>(nameof(StringElement.Value),
                                                                                               (info, element) => element.Value,
                                                                                               (info, element, arg3) =>
            {
                element.Value = arg3;
                element.Reload();
            }));
            memberProvider.Register(AttachedBindingMember.CreateEvent(AttachedMembers.StringElement.TappedEvent,
                                                                      (info, element, arg3) =>
            {
                var weakWrapper          = arg3.ToWeakWrapper();
                IDisposable unsubscriber = null;
                Action action            = () =>
                {
                    if (!weakWrapper.EventListener.TryHandle(weakWrapper.EventListener, EventArgs.Empty))
                    {
                        unsubscriber.Dispose();
                    }
                };
                unsubscriber = WeakActionToken.Create(element, action,
                                                      (stringElement, nsAction) => stringElement.Tapped -= nsAction);
                element.Tapped += action;
                return(unsubscriber);
            }));
        }
 public static void RegisterTabLayoutMembers()
 {
     MemberProvider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembers.ViewGroup.ItemsSource.Override <TabLayout>(), TabLayoutItemsSourceChanged));
     MemberProvider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.TabLayout.RestoreSelectedIndex));
     MemberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembersDesign.TabLayout.SelectedItem,
                                                                TabLayoutGetSelectedItem, TabLayoutSetSelectedItem, (info, layout, arg3) =>
     {
         arg3 = arg3.ToWeakEventListener();
         layout.TabSelected   += arg3.Handle;
         layout.TabUnselected += arg3.Handle;
         return(WeakActionToken.Create(layout, arg3, (tabLayout, listener) =>
         {
             tabLayout.TabSelected -= listener.Handle;
             tabLayout.TabUnselected -= listener.Handle;
         }));
     }));
 }
Exemple #10
0
 public virtual IDisposable SuspendNotifications()
 {
     Interlocked.Increment(ref _suspendCount);
     return(WeakActionToken.Create(this, @base => @base.EndSuspendNotifications()));
 }
 public virtual IDisposable SuspendNotifications()
 {
     lock (Locker)
         ++_suspendCount;
     return(WeakActionToken.Create(this, collection => collection.EndSuspendNotifications()));
 }
        protected override bool LoadInternal()
        {
            IBindingMemberProvider provider = BindingServiceProvider.MemberProvider;

            //NavigationView
            provider.Register(
                AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.NavigationView.MenuTemplate,
                                                         NavigationViewMenuTemplateChanged));

            //TabLayout
            provider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembers.ViewGroup.ItemsSource.Override <TabLayout>(), TabLayoutItemsSourceChanged));
            provider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.TabLayout.RestoreSelectedIndex));
            provider.Register(AttachedBindingMember.CreateMember(AttachedMembersDesign.TabLayout.SelectedItem,
                                                                 TabLayoutGetSelectedItem, TabLayoutSetSelectedItem, (info, layout, arg3) =>
            {
                arg3 = arg3.ToWeakEventListener();
                layout.TabSelected   += arg3.Handle;
                layout.TabUnselected += arg3.Handle;
                return(WeakActionToken.Create(layout, arg3, (tabLayout, listener) =>
                {
                    tabLayout.TabSelected -= listener.Handle;
                    tabLayout.TabUnselected -= listener.Handle;
                }));
            }));

            //TabLayout.Tab
            provider.Register(AttachedBindingMember.CreateNotifiableMember <TabLayout.Tab, string>("Text",
                                                                                                   (info, tab) => tab.Text,
                                                                                                   (info, tab, arg3) =>
            {
                tab.SetText(arg3);
                return(true);
            }));
            provider.Register(AttachedBindingMember.CreateNotifiableMember <TabLayout.Tab, string>("ContentDescription",
                                                                                                   (info, tab) => tab.ContentDescription,
                                                                                                   (info, tab, arg3) =>
            {
                tab.SetContentDescription(arg3);
                return(true);
            }));
            provider.Register(AttachedBindingMember.CreateNotifiableMember <TabLayout.Tab, object>("Icon",
                                                                                                   (info, tab) => tab.Icon,
                                                                                                   (info, tab, arg3) =>
            {
                if (arg3 is int)
                {
                    tab.SetIcon((int)arg3);
                }
                else
                {
                    tab.SetIcon((Drawable)arg3);
                }
                return(true);
            }));
            provider.Register(AttachedBindingMember.CreateNotifiableMember <TabLayout.Tab, Object>("Tag",
                                                                                                   (info, tab) => tab.Tag,
                                                                                                   (info, tab, arg3) =>
            {
                tab.SetTag(arg3);
                return(true);
            }));

            //EditText
            provider.Register(AttachedBindingMember.CreateAutoProperty <EditText, string>(BindingErrorProvider.ErrorPropertyName,
                                                                                          (text, args) =>
            {
                var layout = text.Parent as TextInputLayout;
                if (layout == null)
                {
                    text.Error = args.NewValue;
                }
                else
                {
                    text.Error   = null;
                    layout.Error = args.NewValue;
                }
            }, getDefaultValue: (text, info) => text.Error));

            //Activity
            provider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.Activity.SnackbarView));
            provider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.Activity.SnackbarViewSelector));
            provider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembersDesign.Activity.SnackbarTemplateSelector));

            if (IocContainer != null)
            {
                IToastPresenter toastPresenter;
                IocContainer.TryGet(out toastPresenter);
                IocContainer.BindToConstant <IToastPresenter>(new SnackbarToastPresenter(IocContainer.Get <IThreadManager>(), toastPresenter));
            }

            return(true);
        }
        private static void Register(IBindingMemberProvider memberProvider)
        {
            BindingBuilderExtensions.RegisterDefaultBindingMember <Button>(nameof(Button.Click));
            BindingBuilderExtensions.RegisterDefaultBindingMember <TextBox>(nameof(TextBox.Text));
            BindingBuilderExtensions.RegisterDefaultBindingMember <Label>(nameof(Label.Text));
            BindingBuilderExtensions.RegisterDefaultBindingMember <CheckBox>(nameof(CheckBox.Checked));
            BindingBuilderExtensions.RegisterDefaultBindingMember <ProgressBar>(nameof(ProgressBar.Value));

            //Object
            var itemsSourceMember         = AttachedBindingMember.CreateAutoProperty <object, IEnumerable>(AttachedMemberConstants.ItemsSource, ObjectItemsSourceChanged);
            var defaultMemberRegistration = new DefaultAttachedMemberRegistration <IEnumerable>(itemsSourceMember);

            memberProvider.Register(defaultMemberRegistration.ToAttachedBindingMember <object>());
            memberProvider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembers.Object.CollectionViewManager));
            memberProvider.Register(AttachedBindingMember.CreateAutoProperty <object, IContentViewManager>(AttachedMembers.Control.ContentViewManager.Path));
            memberProvider.Register(AttachedBindingMember.CreateAutoProperty(ItemsSourceGeneratorBase.MemberDescriptor,
                                                                             (o, args) =>
            {
                IEnumerable itemsSource = null;
                if (args.OldValue != null)
                {
                    itemsSource = args.OldValue.ItemsSource;
                    args.OldValue.SetItemsSource(null);
                }
                args.NewValue?.SetItemsSource(itemsSource);
            }));

            var itemTemplateMember = AttachedBindingMember.CreateAutoProperty <object, IDataTemplateSelector>(AttachedMemberConstants.ItemTemplateSelector);

            memberProvider.Register(itemTemplateMember);
            memberProvider.Register(typeof(object), AttachedMemberConstants.ItemTemplate, itemTemplateMember, true);

            //Form
            memberProvider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembers.Form.ToastTemplateSelector));

            //Control
            var sizeChanged = memberProvider.GetBindingMember(typeof(Control), nameof(Control.SizeChanged), true, false);

            if (sizeChanged != null)
            {
                memberProvider.Register(typeof(Control), "WidthChanged", sizeChanged, true);
                memberProvider.Register(typeof(Control), "HeightChanged", sizeChanged, true);
            }
            memberProvider.Register(AttachedBindingMember
                                    .CreateMember <Control, object>(AttachedMemberConstants.FindByNameMethod, FindByNameControlMember));
            memberProvider.Register(AttachedBindingMember
                                    .CreateMember <Control, bool>(AttachedMemberConstants.Focused, (info, control) => control.Focused,
                                                                  (info, control, arg3) =>
            {
                if (arg3)
                {
                    control.Focus();
                }
            }, nameof(Control.LostFocus)));

            memberProvider.Register(AttachedBindingMember.CreateAutoProperty(AttachedMembers.Control.Content, ContentChanged));
            var contenMember = AttachedBindingMember.CreateAutoProperty(AttachedMembers.Control.ContentTemplateSelector, ContentTemplateChanged);

            memberProvider.Register(contenMember);
            memberProvider.Register(typeof(Control), AttachedMemberConstants.ContentTemplate, contenMember, true);

            //DateTimePicker
            BindingBuilderExtensions.RegisterDefaultBindingMember <DateTimePicker>(nameof(DateTimePicker.Value));
            memberProvider.Register(AttachedBindingMember.CreateMember <DateTimePicker, DateTime>(nameof(DateTimePicker.Value),
                                                                                                  (info, picker) => picker.Value,
                                                                                                  (info, picker, value) =>
            {
                if (value < picker.MinDate)
                {
                    picker.Value = picker.MinDate;
                }
                else if (value > picker.MaxDate)
                {
                    picker.Value = picker.MaxDate;
                }
                else
                {
                    picker.Value = value;
                }
            }, nameof(DateTimePicker.ValueChanged)));

            //ToolStripItem
            BindingBuilderExtensions.RegisterDefaultBindingMember <ToolStripButton>(nameof(ToolStripButton.Click));
            BindingBuilderExtensions.RegisterDefaultBindingMember <ToolStripMenuItem>(nameof(ToolStripMenuItem.Click));
            BindingBuilderExtensions.RegisterDefaultBindingMember <ToolStripItem>(nameof(ToolStripItem.Text));
            memberProvider.Register(AttachedBindingMember.CreateMember <ToolStripItem, object>(AttachedMemberConstants.ParentExplicit,
                                                                                               GetParentToolStripItem, null, ObserveParentMemberToolStripItem));
            memberProvider.Register(AttachedBindingMember.CreateMember <ToolStripItem, object>(AttachedMemberConstants.FindByNameMethod,
                                                                                               FindByNameMemberToolStripItem));

            //TabControl
            BindingBuilderExtensions.RegisterDefaultBindingMember(AttachedMembers.Object.ItemsSource.Override <TabControl>());
            memberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.TabControl.SelectedItem,
                                                                       GetSelectedItemTabControl, SetSelectedItemTabControl, nameof(TabControl.Selected)));

            //ComboBox
            BindingBuilderExtensions.RegisterDefaultBindingMember(AttachedMembers.Object.ItemsSource.Override <ComboBox>());
            memberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.Object.ItemsSource.Override <ComboBox>(),
                                                                       (info, box) => box.DataSource as IEnumerable,
                                                                       (info, box, value) => box.DataSource = value, nameof(ComboBox.DataSourceChanged)));
            memberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.ComboBox.SelectedItem,
                                                                       (info, box) => box.SelectedItem, (info, box, value) => box.SelectedItem = value, nameof(ComboBox.SelectedIndexChanged)));

            //DataGridView
            BindingBuilderExtensions.RegisterDefaultBindingMember(AttachedMembers.Object.ItemsSource.Override <DataGridView>());
            memberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.Object.ItemsSource.Override <DataGridView>(),
                                                                       (info, view) => view.DataSource as IEnumerable, (info, view, value) =>
            {
                view.DataSource = value;
                view.Refresh();
            }, nameof(DataGridView.DataSourceChanged)));
            memberProvider.Register(AttachedBindingMember.CreateMember(AttachedMembers.DataGridView.SelectedItem,
                                                                       GetSelectedItemDataGridView, SetSelectedItemDataGridView, (info, view, arg3) =>
            {
                arg3 = arg3.ToWeakEventListener();
                EventHandler handler = null;
                handler = (sender, args) =>
                {
                    var gridView = (DataGridView)sender;
                    Action <DataGridView, IEventListener, EventHandler> action =
                        (dataGridView, listener, eventHandler) =>
                    {
                        if (!listener.TryHandle(dataGridView, EventArgs.Empty))
                        {
                            dataGridView.CurrentCellChanged -= eventHandler;
                        }
                    };
                    //To prevent this exception 'Operation not valid because it results in a reentrant call to the SetCurrentCellAddressCore function'
                    gridView.BeginInvoke(action, gridView, arg3, handler);
                };
                view.CurrentCellChanged += handler;
                return(WeakActionToken.Create(view, handler,
                                              (gridView, eventHandler) => gridView.CurrentCellChanged -= eventHandler));
            }));
        }