Exemple #1
0
        private object GetItemFromTemplate(object view, int index)
        {
            object item = GetItem(index);

            if (_itemTemplateMember == null)
            {
#if WINFORMS
                if (_isTabControl)
                {
                    return(CreateDefaultTabPage(item));
                }
#endif
                return(GetDefaultTemplate(item));
            }
            var selector = (IDataTemplateSelector)_itemTemplateMember.GetValue(view, null);
            if (selector == null)
            {
#if WINFORMS
                if (_isTabControl)
                {
                    return(CreateDefaultTabPage(item));
                }
#endif
                return(GetDefaultTemplate(item));
            }
            return(selector.SelectTemplateWithContext(item, view));
        }
Exemple #2
0
 private void UpdateValues()
 {
     if (_templateSelectorMember != null)
     {
         _templateSelector = _templateSelectorMember.GetValue(_container, Empty.Array <object>()) as TItem;
     }
 }
        protected virtual object GetDefaultValue(object targetObject, object targetProperty, IDataBinding binding, string targetPath)
        {
#if WPF
            var dp = targetProperty as DependencyProperty;
            if (dp != null)
            {
                return(((DependencyObject)targetObject).GetValue(dp));
            }
#endif
            var eventInfo = targetProperty as EventInfo;
            if (eventInfo != null)
            {
                return(CreateDelegateForEvent(eventInfo));
            }

            if (_targetMemberInfo == null)
            {
                _targetMemberInfo = BindingServiceProvider
                                    .MemberProvider
                                    .GetBindingMember(targetObject.GetType(), targetPath, false, false);
            }
            if (_targetMemberInfo == null)
            {
                return(GetEmptyValue());
            }
#if WPF
            eventInfo = _targetMemberInfo.Member as EventInfo;
            if (eventInfo != null)
            {
                return(CreateDelegateForEvent(eventInfo));
            }
#endif
            return(_targetMemberInfo.GetValue(targetObject, null));
        }
 public object GetParent(object source)
 {
     if (_parentMember == null)
     {
         return(_attachedParent);
     }
     return(_parentMember.GetValue(source, Empty.Array <object>()) ?? _attachedParent);
 }
Exemple #5
0
 private ICollectionViewManager GetCollectionViewManager(object view)
 {
     if (_collectionViewManagerMember == null)
     {
         return(DefaultCollectionViewManager.Instance);
     }
     return(_collectionViewManagerMember.GetValue(view, null) as ICollectionViewManager ?? DefaultCollectionViewManager.Instance);
 }
        /// <summary>
        ///     Tries to find parent.
        /// </summary>
        public virtual object FindParent(object target)
        {
            Should.NotBeNull(target, "target");
            Type type = target.GetType();
            IBindingMemberInfo parentProp = GetParentMember(type);

            return(parentProp == null ? null : parentProp.GetValue(target, null));
        }
        protected override IBindingPathMembers UpdateInternal(IBindingPathMembers oldPath, bool hasSubscribers)
        {
            object source = GetActualSource();

            if (source == null || source.IsUnsetValue())
            {
                return(UnsetBindingPathMembers.Instance);
            }
            bool allMembersAvailable = true;
            IBindingMemberProvider memberProvider = BindingServiceProvider.MemberProvider;
            IList <string>         items          = Path.Parts;

            //Trying to get member using full path with dot, example BindingErrorProvider.Errors or ErrorProvider.Errors.
            if (items.Count == 2)
            {
                var pathMember = memberProvider.GetBindingMember(source.GetType(), Path.Path, _ignoreAttachedMembers, false);
                if (pathMember != null)
                {
                    var observer = TryObserveMember(source, pathMember, true);
                    if (observer != null)
                    {
                        _listeners.Add(observer);
                    }
                    return(new MultiBindingPathMembers(_lastMemberListener.Reference, source, new[] { pathMember }));
                }
            }


            int lastIndex = items.Count - 1;
            var members   = new List <IBindingMemberInfo>();

            for (int index = 0; index < items.Count; index++)
            {
                string             name       = items[index];
                IBindingMemberInfo pathMember = memberProvider
                                                .GetBindingMember(source.GetType(), name, _ignoreAttachedMembers, true);
                members.Add(pathMember);
                var observer = TryObserveMember(source, pathMember, index == lastIndex);
                if (observer != null)
                {
                    _listeners.Add(observer);
                }
                if (index == lastIndex)
                {
                    break;
                }
                source = pathMember.GetValue(source, null);
                if (source == null || source.IsUnsetValue())
                {
                    allMembersAvailable = false;
                    break;
                }
            }

            return(allMembersAvailable
                ? new MultiBindingPathMembers(_lastMemberListener.Reference, source, members)
                : UnsetBindingPathMembers.Instance);
        }
 private void UpdateValues()
 {
     if (_templateSelectorMember != null)
     {
         var value = _templateSelectorMember.GetValue(_container, Empty.Array <object>());
         _collectionCellTemplateSelector = value as ICollectionCellTemplateSelector;
         _tableCellTemplateSelector      = value as ITableCellTemplateSelector;
     }
 }
Exemple #9
0
        private void SourceOnValueChanging(IBindingSourceAccessor sender, ValueAccessorChangingEventArgs args)
        {
            if (args.Cancel)
            {
                return;
            }
            object value = Binding.TargetAccessor.Source.GetPathMembers(false).PenultimateValue;

            if (value != null && !value.IsUnsetValue())
            {
                args.Cancel = (bool)_member.GetValue(value, null);
            }
        }
Exemple #10
0
 private void UpdateValues()
 {
     if (_templateSelectorMember != null)
     {
         var value = _templateSelectorMember.GetValue(_container, Empty.Array <object>());
         _resourceSelector = value as IResourceDataTemplateSelector;
         _templateSelector = value as IDataTemplateSelector;
     }
     if (_templateMember != null)
     {
         _templateId = _templateMember.GetValue(_container, Empty.Array <object>()) as int?;
     }
 }
        public static TValue TryGetValue <TValue>([CanBeNull] this IBindingMemberInfo bindingMember, object item, TValue defaultValue = default(TValue), bool itemCanBeNull = false)
        {
            if (bindingMember == null || (!itemCanBeNull && item == null))
            {
                return(defaultValue);
            }
            var value = bindingMember.GetValue(item, null);

            if (value is TValue)
            {
                return((TValue)value);
            }
            return(defaultValue);
        }
        private object GetItemFromTemplate(object item)
        {
            if (_templateMemberInfo == null)
            {
                return(GetDefaultTemplate(item));
            }
            var selector = (IDataTemplateSelector)_templateMemberInfo.GetValue(_container, null);

            if (selector == null)
            {
                return(GetDefaultTemplate(item));
            }
            return(selector.SelectTemplateWithContext(item, _container));
        }
Exemple #13
0
        protected virtual object GetDefaultValue(object targetObject, object targetProperty, IDataBinding binding, string targetPath)
        {
#if WPF
            var dp = targetProperty as DependencyProperty;
            if (dp != null)
            {
                return(((DependencyObject)targetObject).GetValue(dp));
            }
#endif
            var eventInfo = targetProperty as EventInfo;
            if (eventInfo != null)
            {
                return(CreateDelegateForEvent(eventInfo));
            }

            if (_targetMemberInfo == null)
            {
                _targetMemberInfo = BindingServiceProvider
                                    .MemberProvider
                                    .GetBindingMember(targetObject.GetType(), targetPath, false, false);
            }
            if (_targetMemberInfo == null)
            {
                return(GetEmptyValue());
            }
#if XAMARIN_FORMS
            //BUG: null value throw an error https://bugzilla.xamarin.com/show_bug.cgi?id=24584
            var value = _targetMemberInfo.GetValue(targetObject, null);
            if (value == null && _targetMemberInfo.Type == typeof(string))
            {
                return(string.Empty);
            }
            return(value);
#else
            return(_targetMemberInfo.GetValue(targetObject, null));
#endif
        }
        /// <summary>
        ///     Updates the current values.
        /// </summary>
        protected override void UpdateInternal()
        {
            try
            {
                ClearListeners();
                object source = GetActualSource();
                if (source == null || source.IsUnsetValue())
                {
                    _members = UnsetBindingPathMembers.Instance;
                    return;
                }
                bool allMembersAvailable = true;
                IBindingMemberProvider memberProvider = BindingServiceProvider.MemberProvider;
                IList <string>         items          = Path.Parts;
                int lastIndex = items.Count - 1;
                var members   = new List <IBindingMemberInfo>();
                for (int index = 0; index < items.Count; index++)
                {
                    string             name       = items[index];
                    IBindingMemberInfo pathMember = memberProvider
                                                    .GetBindingMember(source.GetType(), name, _ignoreAttachedMembers, true);
                    members.Add(pathMember);
                    var observer = TryObserveMember(source, pathMember, index == lastIndex);
                    if (observer != null)
                    {
                        _listeners.Add(observer);
                    }
                    if (index == lastIndex)
                    {
                        break;
                    }
                    source = pathMember.GetValue(source, null);
                    if (source == null || source.IsUnsetValue())
                    {
                        allMembersAvailable = false;
                        break;
                    }
                }

                _members = allMembersAvailable
                    ? new MultiBindingPathMembers(_selfReference, source, Path, members)
                    : UnsetBindingPathMembers.Instance;
            }
            catch (Exception)
            {
                _members = UnsetBindingPathMembers.Instance;
                throw;
            }
        }
        public void Inflate(Activity activity, IMenu menu)
        {
            IBindingMemberInfo bindingMember = BindingServiceProvider
                                               .MemberProvider
                                               .GetBindingMember(typeof(OptionsMenu), AttachedMembers.Toolbar.MenuTemplate, false, true);
            var value = (int)bindingMember.GetValue(this, null);

            activity.MenuInflater.Inflate(value, menu, this);
            if (_bindings != null)
            {
                foreach (string binding in _bindings)
                {
                    BindingServiceProvider.BindingProvider.CreateBindingsFromString(menu, binding, null);
                }
            }
        }
Exemple #16
0
        internal static string TryGetValue(object instance, string name)
        {
            if (instance == null)
            {
                return(null);
            }
            IBindingMemberInfo member = BindingServiceProvider
                                        .MemberProvider
                                        .GetBindingMember(instance.GetType(), name, false, false);

            if (member == null || !member.CanRead)
            {
                return(null);
            }
            return(member.GetValue(instance, null)?.ToString());
        }
            public bool TryHandle(object sender, object message)
            {
                var view = _view;

                if (!view.IsAlive())
                {
                    Update(null);
                    return(false);
                }

                var activity = _view.Context.GetActivity();

                if (activity == null)
                {
                    Update(null);
                    Tracer.Warn("(PopupMenu) The contex of view is not an activity.");
                    return(false);
                }

                var templateId = (int)BindingServiceProvider
                                 .MemberProvider
                                 .GetBindingMember(_viewType, AttachedMemberNames.PopupMenuTemplate, false, true)
                                 .GetValue(_view, null);
                IBindingMemberInfo bindingMember = BindingServiceProvider
                                                   .MemberProvider
                                                   .GetBindingMember(_viewType, AttachedMemberNames.PlacementTargetPath, false, false);

                if (bindingMember != null)
                {
                    var path = (string)bindingMember.GetValue(view, null);
                    if (!string.IsNullOrEmpty(path))
                    {
                        var itemView = (View)BindingExtensions.GetValueFromPath(message, path);
                        if (itemView != null)
                        {
                            view = itemView;
                        }
                    }
                }

                var menu = new PopupMenu(activity, view);

                activity.MenuInflater.Inflate(templateId, menu.Menu, view);
                menu.SetOnDismissListener(DismissListener);
                menu.Show();
                return(true);
            }
Exemple #18
0
        internal static DependencyObject FindParent(FrameworkElement target)
        {
            IBindingMemberInfo member = BindingServiceProvider
                                        .MemberProvider
                                        .GetBindingMember(target.GetType(), "PlacementTarget", false, false);

            if (member != null)
            {
                object value = member.GetValue(target, null);
                if (value == null)
                {
                    return(null);
                }
                return((DependencyObject)value);
            }
            return(VisualTreeHelper.GetParent(target) ?? target.Parent);
        }
Exemple #19
0
        private object GetItemFromTemplate(object item)
        {
            var target = _containerRef.Target;

            if (_templateMemberInfo == null || target == null)
            {
                return(GetDefaultTemplate(item));
            }

            var selector = (IDataTemplateSelector)_templateMemberInfo.GetValue(target, null);

            if (selector == null)
            {
                return(GetDefaultTemplate(item));
            }
            return(selector.SelectTemplateWithContext(item, target));
        }
Exemple #20
0
        public static object GetValueFromPath(object src, string strPath, int firstMemberIndex = 0)
        {
            IBindingPath path = BindingServiceProvider.BindingPathFactory(strPath);

            for (int index = firstMemberIndex; index < path.Parts.Count; index++)
            {
                string item = path.Parts[index];
                if (src.IsNullOrUnsetValue())
                {
                    return(null);
                }
                IBindingMemberInfo member = BindingServiceProvider
                                            .MemberProvider
                                            .GetBindingMember(src.GetType(), item, false, true);
                src = member.GetValue(src, null);
            }
            return(src);
        }
        public void Inflate(Activity activity, IMenu menu)
        {
            if (!activity.IsAlive() || !menu.IsAlive())
            {
                return;
            }
            IBindingMemberInfo bindingMember = BindingServiceProvider
                                               .MemberProvider
                                               .GetBindingMember(typeof(OptionsMenu), AttachedMembers.Toolbar.MenuTemplate, false, true);
            var value = (int?)bindingMember.GetValue(this, null);

            if (value == null)
            {
                return;
            }
            activity.MenuInflater.Inflate(value.Value, menu, this);
            if (!string.IsNullOrEmpty(_bind))
            {
                BindingServiceProvider.BindingProvider.CreateBindingsFromString(menu, _bind, null);
            }
        }
        internal static object FindParent(FrameworkElement target)
        {
            IBindingMemberInfo member = BindingServiceProvider
                                        .MemberProvider
                                        .GetBindingMember(target.GetType(), "PlacementTarget", false, false);

            if (member != null)
            {
                object value = member.GetValue(target, null);
                if (value != null)
                {
                    return(value);
                }
            }
#if WPF
            if (target.IsLoaded)
            {
                return(target.Parent ?? VisualTreeHelper.GetParent(target) ?? LogicalTreeHelper.GetParent(target));
            }
            return(target.Parent);
#else
            return(target.Parent ?? VisualTreeHelper.GetParent(target));
#endif
        }
        protected override bool SetValueInternal(IBindingSourceAccessor targetAccessor, IDataContext context,
                                                 bool throwOnError)
        {
            IBindingPathMembers members = _bindingSource.GetPathMembers(throwOnError);
            object penultimateValue     = members.PenultimateValue;

            if (penultimateValue.IsUnsetValue() || (penultimateValue == null && !members.AllMembersAvailable))
            {
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding cannot set value for path {members.Path.Path}", new object[] { members });
                }
                return(false);
            }

            IBindingMemberInfo lastMember = members.LastMember;
            object             oldValue;
            object             newValue = targetAccessor.GetValue(lastMember, context, throwOnError);

            if (lastMember.CanRead && !BindingMemberType.BindingContext.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                if (_disableEqualityChecking && !BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
                {
                    oldValue = BindingConstants.UnsetValue;
                }
                else
                {
                    oldValue = lastMember.GetValue(penultimateValue, null);
                }
                if (ReferenceEquals(oldValue, newValue) || newValue.IsUnsetValueOrDoNothing())
                {
                    if (members.Path.IsDebuggable)
                    {
                        DebugInfo($"Binding ignores setter because old value: '{oldValue}' equals to new value '{newValue}'", new[] { members, oldValue, newValue });
                    }
                    return(false);
                }
            }
            else
            {
                oldValue = BindingConstants.UnsetValue;
                if (newValue.IsUnsetValueOrDoNothing())
                {
                    if (members.Path.IsDebuggable)
                    {
                        DebugInfo($"Binding ignores setter for value '{newValue}'", new[] { members, newValue });
                    }
                    return(false);
                }
            }

            ValueAccessorChangingEventArgs args = null;

            if (ValueChanging != null)
            {
                args = RaiseValueChanging(context, penultimateValue, lastMember, oldValue, newValue);
                if (args != null)
                {
                    if (args.Cancel)
                    {
                        return(false);
                    }
                    if (!ReferenceEquals(newValue, args.NewValue))
                    {
                        newValue = args.NewValue;
                        if (newValue.IsUnsetValueOrDoNothing())
                        {
                            if (members.Path.IsDebuggable)
                            {
                                DebugInfo($"Binding ignores setter for value '{newValue}'", new[] { members, newValue });
                            }
                            return(false);
                        }
                    }
                }
            }
            newValue = BindingServiceProvider.ValueConverter(lastMember, lastMember.Type, newValue);
            if (Equals(oldValue, newValue))
            {
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding ignores setter because old value: '{oldValue}' equals to new value '{newValue}'", new[] { members, oldValue, newValue });
                }
                return(false);
            }
            if (BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                TryRegisterEvent((BindingActionValue)oldValue, newValue, context, members);
                RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
            }
            else
            {
                _closure?.Unsubscribe(false, _isOneTime);
                lastMember.SetSingleValue(penultimateValue, newValue);
                if (members.Path.IsDebuggable)
                {
                    DebugInfo($"Binding set value: '{newValue}' for source: '{penultimateValue}' with path: '{lastMember.Path}'", new[] { newValue, penultimateValue, lastMember });
                }
                if (ValueChanged != null)
                {
                    RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
                }
            }
            return(true);
        }
Exemple #24
0
 private ICollectionViewManager GetCollectionViewManager()
 {
     return(_collectionViewManagerMember == null
         ? null
         : _collectionViewManagerMember.GetValue(_viewGroup, null) as ICollectionViewManager);
 }
Exemple #25
0
        protected virtual IBindingMemberInfo GetTargetProperty(object targetObject, IServiceProvider serviceProvider, out string path)
        {
            //NOTE Xamarin doesn't support this property.
            //            return serviceProvider.GetService<IProvideValueTarget>().TargetProperty;

            //Making some reflection magic.
            path = null;
            if (targetObject == null)
            {
                return(null);
            }

            UpdateMember(ref _getXamlNodeProvider, serviceProvider, "IXamlNodeProvider");
            var xamlNodeProvider = _getXamlNodeProvider.GetValue(serviceProvider, null);

            if (xamlNodeProvider == null)
            {
                return(null);
            }

            UpdateMember(ref _getXamlNode, xamlNodeProvider, "XamlNode");
            var xamlNode = _getXamlNode.GetValue(xamlNodeProvider, null);

            if (xamlNode == null)
            {
                return(null);
            }

            UpdateMember(ref _getParentNode, xamlNode, "Parent");
            var parentNode = _getParentNode.GetValue(xamlNode, null);

            if (parentNode == null)
            {
                return(null);
            }

            UpdateMember(ref _getProperties, parentNode, "Properties");
            var properties = (IDictionary)_getProperties.GetValue(parentNode, null);

            if (properties == null)
            {
                return(null);
            }

            object xmlName = null;

            foreach (DictionaryEntry entry in properties)
            {
                if (ReferenceEquals(entry.Value, xamlNode))
                {
                    xmlName = entry.Key;
                    break;
                }
            }
            if (xmlName == null)
            {
                return(null);
            }

            UpdateMember(ref _getLocalName, xmlName, "LocalName");
            path = (string)_getLocalName.GetValue(xmlName, null);
            return(BindingServiceProvider.MemberProvider.GetBindingMember(targetObject.GetType(), path, false, false));
        }
Exemple #26
0
        protected override IBindingPathMembers UpdateInternal(IBindingPathMembers oldPath, bool hasSubscribers)
        {
            object source = GetActualSource();

            if (source.IsNullOrUnsetValue())
            {
                return(UnsetBindingPathMembers.Instance);
            }
            ClearListeners();
            int lastIndex;

            if (_hasStablePath)
            {
                var pathMembers = oldPath as MultiBindingPathMembers;
                if (pathMembers != null)
                {
                    var list = pathMembers.Members;
                    lastIndex = list.Count - 1;
                    for (int index = 0; index < list.Count; index++)
                    {
                        var pathMember = list[index];
                        if (_observable)
                        {
                            var observer = TryObserveMember(source, pathMember, index == lastIndex);
                            if (observer != null)
                            {
                                _listeners.Add(observer);
                            }
                        }
                        if (index == lastIndex)
                        {
                            break;
                        }
                        source = pathMember.GetValue(source, null);
                        if (source.IsNullOrUnsetValue())
                        {
                            if (Path.IsDebuggable)
                            {
                                DebugInfo($"Value is not available for '{pathMember.Path}'", new[] { GetActualSource(false) });
                            }
                            return(UnsetBindingPathMembers.Instance);
                        }
                    }
                    pathMembers.PenultimateValueRef = ToolkitExtensions.GetWeakReference(source);
                    return(pathMembers);
                }
            }

            IList <string> items = Path.Parts;

            lastIndex = items.Count - 1;
            var members = new List <IBindingMemberInfo>();

            for (int index = 0; index < items.Count; index++)
            {
                IBindingMemberInfo pathMember = GetBindingMember(source.GetType(), items[index], _ignoreAttachedMembers, _optional);
                if (pathMember == null)
                {
                    return(UnsetBindingPathMembers.Instance);
                }
                members.Add(pathMember);
                if (_observable)
                {
                    var observer = TryObserveMember(source, pathMember, index == lastIndex);
                    if (observer != null)
                    {
                        _listeners.Add(observer);
                    }
                }
                if (index == lastIndex)
                {
                    break;
                }
                source = pathMember.GetValue(source, null);
                if (source.IsNullOrUnsetValue())
                {
                    if (Path.IsDebuggable)
                    {
                        DebugInfo($"Value is not available for '{pathMember.Path}'", new[] { GetActualSource(false) });
                    }
                    return(UnsetBindingPathMembers.Instance);
                }
            }

            return(new MultiBindingPathMembers(_lastMemberListener.Reference, source, members));
        }
 private ICollectionViewManager GetCollectionViewManager()
 {
     return(_collectionViewManagerMember == null
         ? null
         : _collectionViewManagerMember.GetValue(_preference, null) as ICollectionViewManager);
 }
 private ICollectionViewManager GetCollectionViewManager()
 {
     return((ICollectionViewManager)_collectionViewManagerMember.GetValue(TabHost, Empty.Array <object>()));
 }
Exemple #29
0
 public object GetValue(object src, object[] args)
 {
     return(_member.GetValue(src, BindingReflectionExtensions.InsertFirstArg(args ?? MugenMvvmToolkit.Empty.Array <object>(), _indexes)));
 }
        protected override bool SetValueInternal(IBindingSourceAccessor targetAccessor, IDataContext context,
                                                 bool throwOnError)
        {
            IBindingPathMembers members = _bindingSource.GetPathMembers(throwOnError);

            if (!members.AllMembersAvailable)
            {
                return(false);
            }

            object             penultimateValue = members.PenultimateValue;
            IBindingMemberInfo lastMember       = members.LastMember;

            object oldValue;
            object newValue = targetAccessor.GetValue(lastMember, context, throwOnError);

            if (lastMember.CanRead && !BindingMemberType.BindingContext.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                oldValue = lastMember.GetValue(penultimateValue, null);
                if (ReferenceEquals(oldValue, newValue) || newValue.IsUnsetValueOrDoNothing())
                {
                    return(false);
                }
            }
            else
            {
                oldValue = BindingConstants.UnsetValue;
                if (newValue.IsUnsetValueOrDoNothing())
                {
                    return(false);
                }
            }

            ValueAccessorChangingEventArgs args = null;

            if (ValueChanging != null)
            {
                args = RaiseValueChanging(context, penultimateValue, lastMember, oldValue, newValue);
                if (args != null)
                {
                    if (args.Cancel)
                    {
                        return(false);
                    }
                    if (!ReferenceEquals(newValue, args.NewValue))
                    {
                        newValue = args.NewValue;
                        if (newValue.IsUnsetValueOrDoNothing())
                        {
                            return(false);
                        }
                    }
                }
            }
            newValue = BindingServiceProvider.ValueConverter(lastMember, lastMember.Type, newValue);
            if (Equals(oldValue, newValue))
            {
                return(false);
            }
            if (BindingMemberType.Event.EqualsWithoutNullCheck(lastMember.MemberType))
            {
                TryRegisterEvent((BindingActionValue)oldValue, newValue, context);
                RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
            }
            else
            {
                if (_closure != null)
                {
                    _closure.Unsubscribe(false, _isOneTime);
                }
                lastMember.SetSingleValue(penultimateValue, newValue);
                if (ValueChanged != null)
                {
                    RaiseValueChanged(context, penultimateValue, lastMember, oldValue, newValue, args);
                }
            }
            return(true);
        }