private void BindToDataContextWhenItsSet(XamlBindingDefinition definition)
        {
            var target = definition.Target;
            var dataContext = target.DataContext;

            var binding = this.propertyBinder.GetBinding(target, definition.TargetProperty);
            binding.Bind(dataContext);
        }
Ejemplo n.º 2
0
        private void BindToDataContextWhenItsSet(XamlBindingDefinition definition)
        {
            var target      = definition.Target;
            var dataContext = target.DataContext;

            var binding = _propertyBinder.GetBinding(target, definition.TargetProperty);

            binding.BindToDataContext(dataContext);
        }
Ejemplo n.º 3
0
        private void HandleXamlBindingDefinition(XamlBindingDefinition xamlBindingDefinition)
        {
            PerspexObject subjectObject = xamlBindingDefinition.Target;

            _propertyBinder.Create(xamlBindingDefinition);

            var observableForDataContext = subjectObject.GetObservable(Control.DataContextProperty);

            observableForDataContext.Where(o => o != null).Subscribe(_ => BindToDataContextWhenItsSet(xamlBindingDefinition));
        }
Ejemplo n.º 4
0
        private void HandleXamlBindingDefinition(object instance, XamlBindingDefinition def)
        {
            if (_xamlMember.XamlType.UnderlyingType == typeof(XamlBindingDefinition))
            {
                // TODO: This should search base classes.
                var property = instance.GetType().GetTypeInfo().GetDeclaredProperty(_xamlMember.Name);

                if (property == null || !property.CanWrite)
                {
                    throw new InvalidOperationException(
                              $"Cannot assign to '{_xamlMember.Name}' on '{instance.GetType()}");
                }

                property.SetValue(instance, def);
            }
            else
            {
                var perspexObject = instance as PerspexObject;
                var attached      = _xamlMember as PerspexAttachableXamlMember;

                if (perspexObject == null)
                {
                    throw new InvalidOperationException(
                              $"Cannot bind to an object of type '{instance.GetType()}");
                }

                PerspexProperty property;
                string          propertyName;

                if (attached == null)
                {
                    propertyName = _xamlMember.Name;
                    property     = perspexObject.GetRegisteredProperties()
                                   .FirstOrDefault(x => x.Name == propertyName);
                }
                else
                {
                    // Ensure the OwnerType's static ctor has been run.
                    RuntimeHelpers.RunClassConstructor(attached.DeclaringType.UnderlyingType.TypeHandle);

                    propertyName = attached.DeclaringType.UnderlyingType.Name + '.' + _xamlMember.Name;

                    property = perspexObject.GetRegisteredProperties()
                               .Where(x => x.IsAttached && x.OwnerType == attached.DeclaringType.UnderlyingType)
                               .FirstOrDefault(x => x.Name == _xamlMember.Name);
                }

                if (property == null)
                {
                    throw new InvalidOperationException(
                              $"Cannot find '{propertyName}' on '{instance.GetType()}");
                }

                var binding = new XamlBinding
                {
                    BindingMode        = def.BindingMode,
                    SourcePropertyPath = def.SourcePropertyPath,
                };

                binding.Bind(perspexObject, property);
            }
        }
        private void HandleXamlBindingDefinition(XamlBindingDefinition xamlBindingDefinition)
        {
            PerspexObject subjectObject = xamlBindingDefinition.Target;
            this.propertyBinder.Create(xamlBindingDefinition);

            var observableForDataContext = subjectObject.GetObservable(Control.DataContextProperty);
            observableForDataContext.Where(o => o != null).Subscribe(_ => this.BindToDataContextWhenItsSet(xamlBindingDefinition));
        }