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); })); }
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))); }
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)); })); }
/// <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())); }
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; })); })); }
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)); })); }