private void BindToDataContextWhenItsSet(XamlBindingDefinition definition) { var target = definition.Target; var dataContext = target.DataContext; var binding = this.propertyBinder.GetBinding(target, definition.TargetProperty); binding.Bind(dataContext); }
private void BindToDataContextWhenItsSet(XamlBindingDefinition definition) { var target = definition.Target; var dataContext = target.DataContext; var binding = _propertyBinder.GetBinding(target, definition.TargetProperty); binding.BindToDataContext(dataContext); }
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)); }
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)); }