Beispiel #1
0
 /// <summary>
 /// Creates a new instance of the BindableProperty class.
 /// </summary>
 /// <param name="propertyName">The name of the BindableProperty.</param>
 /// <param name="returnType">The type of the property.</param>
 /// <param name="declaringType">The type of the declaring object.</param>
 /// <param name="defaultValue">The default value for the property.</param>
 /// <param name="defaultBindingMode">The BindingMode to use on SetBinding() if no BindingMode is given. This parameter is optional. Default is BindingMode.OneWay.</param>
 /// <param name="validateValue">A delegate to be run when a value is set. This parameter is optional. Default is null.</param>
 /// <param name="propertyChanged">A delegate to be run when the value has changed. This parameter is optional. Default is null.</param>
 /// <param name="propertyChanging">A delegate to be run when the value will change. This parameter is optional. Default is null.</param>
 /// <param name="coerceValue">A delegate used to coerce the range of a value. This parameter is optional. Default is null.</param>
 /// <param name="defaultValueCreator">A Func used to initialize default value for reference types.</param>
 /// <returns>A newly created BindableProperty.</returns>
 public static BindableProperty Create(string propertyName, Type returnType, Type declaringType, object defaultValue = null, BindingMode defaultBindingMode = BindingMode.OneWay,
                                       ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged = null, BindingPropertyChangingDelegate propertyChanging = null,
                                       CoerceValueDelegate coerceValue     = null, CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return(new BindableProperty(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue,
                                 defaultValueCreator: defaultValueCreator));
 }
Beispiel #2
0
 public static BindableProperty Create <TDeclarer, TPropertyType>(Expression <Func <TDeclarer, TPropertyType> > getter, TPropertyType defaultValue, BindingMode defaultBindingMode = BindingMode.OneWay,
                                                                  ValidateValueDelegate <TPropertyType> validateValue = null, BindingPropertyChangedDelegate <TPropertyType> propertyChanged        = null,
                                                                  BindingPropertyChangingDelegate <TPropertyType> propertyChanging          = null, CoerceValueDelegate <TPropertyType> coerceValue = null,
                                                                  CreateDefaultValueDelegate <TDeclarer, TPropertyType> defaultValueCreator = null) where TDeclarer : BindableObject
 {
     return(Create(getter, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, null, defaultValueCreator: defaultValueCreator));
 }
Beispiel #3
0
 public static BindablePropertyKey CreateAttachedReadOnly(string propertyName, Type returnType, Type declaringType, object defaultValue, BindingMode defaultBindingMode = BindingMode.OneWayToSource,
                                                          ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged = null, BindingPropertyChangingDelegate propertyChanging = null,
                                                          CoerceValueDelegate coerceValue     = null, CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return
         (new BindablePropertyKey(CreateAttached(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, null, true,
                                                 defaultValueCreator)));
 }
Beispiel #4
0
 /// <include file="../../docs/Microsoft.Maui.Controls/BindableProperty.xml" path="//Member[@MemberName='CreateReadOnly']/Docs" />
 public static BindablePropertyKey CreateReadOnly(string propertyName, Type returnType, [DynamicallyAccessedMembers(DeclaringTypeMembers)] Type declaringType, object defaultValue, BindingMode defaultBindingMode = BindingMode.OneWayToSource,
                                                  ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged = null, BindingPropertyChangingDelegate propertyChanging = null,
                                                  CoerceValueDelegate coerceValue     = null, CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return
         (new BindablePropertyKey(new BindableProperty(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue,
                                                       isReadOnly: true, defaultValueCreator: defaultValueCreator)));
 }
Beispiel #5
0
        internal static BindableProperty Create <TDeclarer, TPropertyType>(Expression <Func <TDeclarer, TPropertyType> > getter, TPropertyType defaultValue, BindingMode defaultBindingMode,
                                                                           ValidateValueDelegate <TPropertyType> validateValue, BindingPropertyChangedDelegate <TPropertyType> propertyChanged, BindingPropertyChangingDelegate <TPropertyType> propertyChanging,
                                                                           CoerceValueDelegate <TPropertyType> coerceValue, BindablePropertyBindingChanging bindingChanging, bool isReadOnly = false,
                                                                           CreateDefaultValueDelegate <TDeclarer, TPropertyType> defaultValueCreator = null) where TDeclarer : BindableObject
        {
            if (getter == null)
            {
                throw new ArgumentNullException("getter");
            }

            Expression expr = getter.Body;

            var unary = expr as UnaryExpression;

            if (unary != null)
            {
                expr = unary.Operand;
            }

            var member = expr as MemberExpression;

            if (member == null)
            {
                throw new ArgumentException("getter must be a MemberExpression", "getter");
            }

            var property = (PropertyInfo)member.Member;

            ValidateValueDelegate           untypedValidateValue           = null;
            BindingPropertyChangedDelegate  untypedBindingPropertyChanged  = null;
            BindingPropertyChangingDelegate untypedBindingPropertyChanging = null;
            CoerceValueDelegate             untypedCoerceValue             = null;
            CreateDefaultValueDelegate      untypedDefaultValueCreator     = null;

            if (validateValue != null)
            {
                untypedValidateValue = (bindable, value) => validateValue(bindable, (TPropertyType)value);
            }
            if (propertyChanged != null)
            {
                untypedBindingPropertyChanged = (bindable, oldValue, newValue) => propertyChanged(bindable, (TPropertyType)oldValue, (TPropertyType)newValue);
            }
            if (propertyChanging != null)
            {
                untypedBindingPropertyChanging = (bindable, oldValue, newValue) => propertyChanging(bindable, (TPropertyType)oldValue, (TPropertyType)newValue);
            }
            if (coerceValue != null)
            {
                untypedCoerceValue = (bindable, value) => coerceValue(bindable, (TPropertyType)value);
            }
            if (defaultValueCreator != null)
            {
                untypedDefaultValueCreator = o => defaultValueCreator((TDeclarer)o);
            }

            return(new BindableProperty(property.Name, property.PropertyType, typeof(TDeclarer), defaultValue, defaultBindingMode, untypedValidateValue, untypedBindingPropertyChanged,
                                        untypedBindingPropertyChanging, untypedCoerceValue, bindingChanging, isReadOnly, untypedDefaultValueCreator));
        }
Beispiel #6
0
        BindableProperty(string propertyName, Type returnType, Type declaringType, object defaultValue, BindingMode defaultBindingMode = BindingMode.OneWay,
                         ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged  = null, BindingPropertyChangingDelegate propertyChanging = null,
                         CoerceValueDelegate coerceValue     = null, BindablePropertyBindingChanging bindingChanging = null, bool isReadOnly = false, CreateDefaultValueDelegate defaultValueCreator = null)
        {
            if (propertyName == null)
            {
                throw new ArgumentNullException(nameof(propertyName));
            }
            if (ReferenceEquals(returnType, null))
            {
                throw new ArgumentNullException(nameof(returnType));
            }
            if (ReferenceEquals(declaringType, null))
            {
                throw new ArgumentNullException(nameof(declaringType));
            }

            // don't use Enum.IsDefined as its redonkulously expensive for what it does
            if (defaultBindingMode != BindingMode.Default && defaultBindingMode != BindingMode.OneWay && defaultBindingMode != BindingMode.OneWayToSource && defaultBindingMode != BindingMode.TwoWay && defaultBindingMode != BindingMode.OneTime)
            {
                throw new ArgumentException($"Not a valid type of BindingMode. Property: {returnType} {declaringType.Name}.{propertyName}. Default binding mode: {defaultBindingMode}", nameof(defaultBindingMode));
            }

            if (defaultValue == null && Nullable.GetUnderlyingType(returnType) == null && returnType.GetTypeInfo().IsValueType)
            {
                defaultValue = Activator.CreateInstance(returnType);
            }

            if (defaultValue != null && !returnType.IsInstanceOfType(defaultValue))
            {
                throw new ArgumentException($"Default value did not match return type. Property: {returnType} {declaringType.Name}.{propertyName} Default value type: {defaultValue.GetType().Name}, ", nameof(defaultValue));
            }

            if (defaultBindingMode == BindingMode.Default)
            {
                defaultBindingMode = BindingMode.OneWay;
            }

            PropertyName        = propertyName;
            ReturnType          = returnType;
            ReturnTypeInfo      = returnType.GetTypeInfo();
            DeclaringType       = declaringType;
            DefaultValue        = defaultValue;
            DefaultBindingMode  = defaultBindingMode;
            PropertyChanged     = propertyChanged;
            PropertyChanging    = propertyChanging;
            ValidateValue       = validateValue;
            CoerceValue         = coerceValue;
            BindingChanging     = bindingChanging;
            IsReadOnly          = isReadOnly;
            DefaultValueCreator = defaultValueCreator;
        }
Beispiel #7
0
 /// <summary>
 /// Create bindinble property simpler.
 /// </summary>
 /// <typeparam name="TDeclarer">Type of the declarer.</typeparam>
 /// <typeparam name="TPropertyType">Type of the property.</typeparam>
 /// <param name="propertyName">Property name.</param>
 /// <param name="defaultValue">Default value.</param>
 /// <param name="defaultBindingMode">Default binding mode.</param>
 /// <param name="validateValue">Validate value.</param>
 /// <param name="propertyChanged">Property changed delegate.</param>
 /// <param name="propertyChanging">Property changing delegate.</param>
 /// <param name="coerceValue">Coerce value.</param>
 /// <param name="defaultValueCreator">Default value creator.</param>
 /// <returns>Bindable property.</returns>
 public static BindableProperty Create <TDeclarer, TPropertyType>(
     string propertyName,
     TPropertyType defaultValue                       = default(TPropertyType),
     BindingMode defaultBindingMode                   = BindingMode.OneWay,
     ValidateValueDelegate validateValue              = null,
     BindingPropertyChangedDelegate propertyChanged   = null,
     BindingPropertyChangingDelegate propertyChanging = null,
     CoerceValueDelegate coerceValue                  = null,
     CreateDefaultValueDelegate defaultValueCreator   = null)
 {
     return(BindableProperty.Create(
                propertyName,
                typeof(TPropertyType),
                typeof(TDeclarer),
                defaultValue: defaultValue,
                defaultBindingMode: defaultBindingMode,
                validateValue: validateValue,
                propertyChanged: propertyChanged,
                propertyChanging: propertyChanging,
                coerceValue: coerceValue,
                defaultValueCreator: defaultValueCreator));
 }
Beispiel #8
0
 internal static BindableProperty CreateAttached(string propertyName, Type returnType, Type declaringType, object defaultValue, BindingMode defaultBindingMode, ValidateValueDelegate validateValue,
                                                 BindingPropertyChangedDelegate propertyChanged, BindingPropertyChangingDelegate propertyChanging, CoerceValueDelegate coerceValue, BindablePropertyBindingChanging bindingChanging,
                                                 bool isReadOnly, CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return(new BindableProperty(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, bindingChanging, isReadOnly,
                                 defaultValueCreator));
 }
Beispiel #9
0
        internal static BindableProperty CreateAttached <TDeclarer, TPropertyType>(Expression <Func <BindableObject, TPropertyType> > staticgetter, TPropertyType defaultValue, BindingMode defaultBindingMode,
                                                                                   ValidateValueDelegate <TPropertyType> validateValue, BindingPropertyChangedDelegate <TPropertyType> propertyChanged, BindingPropertyChangingDelegate <TPropertyType> propertyChanging,
                                                                                   CoerceValueDelegate <TPropertyType> coerceValue, BindablePropertyBindingChanging bindingChanging, bool isReadOnly = false,
                                                                                   CreateDefaultValueDelegate <BindableObject, TPropertyType> defaultValueCreator = null)
        {
            if (staticgetter == null)
            {
                throw new ArgumentNullException("staticgetter");
            }

            Expression expr = staticgetter.Body;

            var unary = expr as UnaryExpression;

            if (unary != null)
            {
                expr = unary.Operand;
            }

            var methodcall = expr as MethodCallExpression;

            if (methodcall == null)
            {
                throw new ArgumentException("staticgetter must be a MethodCallExpression", "staticgetter");
            }

            MethodInfo method = methodcall.Method;

            if (!method.Name.StartsWith("Get", StringComparison.Ordinal))
            {
                throw new ArgumentException("staticgetter name must start with Get", "staticgetter");
            }

            string propertyname = method.Name.Substring(3);

            ValidateValueDelegate           untypedValidateValue           = null;
            BindingPropertyChangedDelegate  untypedBindingPropertyChanged  = null;
            BindingPropertyChangingDelegate untypedBindingPropertyChanging = null;
            CoerceValueDelegate             untypedCoerceValue             = null;
            CreateDefaultValueDelegate      untypedDefaultValueCreator     = null;

            if (validateValue != null)
            {
                untypedValidateValue = (bindable, value) => validateValue(bindable, (TPropertyType)value);
            }
            if (propertyChanged != null)
            {
                untypedBindingPropertyChanged = (bindable, oldValue, newValue) => propertyChanged(bindable, (TPropertyType)oldValue, (TPropertyType)newValue);
            }
            if (propertyChanging != null)
            {
                untypedBindingPropertyChanging = (bindable, oldValue, newValue) => propertyChanging(bindable, (TPropertyType)oldValue, (TPropertyType)newValue);
            }
            if (coerceValue != null)
            {
                untypedCoerceValue = (bindable, value) => coerceValue(bindable, (TPropertyType)value);
            }
            if (defaultValueCreator != null)
            {
                untypedDefaultValueCreator = o => defaultValueCreator(o);
            }

            return(new BindableProperty(propertyname, method.ReturnType, typeof(TDeclarer), defaultValue, defaultBindingMode, untypedValidateValue, untypedBindingPropertyChanged, untypedBindingPropertyChanging,
                                        untypedCoerceValue, bindingChanging, isReadOnly, untypedDefaultValueCreator));
        }
Beispiel #10
0
        public static BindablePropertyKey CreateAttachedReadOnly <TDeclarer, TPropertyType>(Expression <Func <BindableObject, TPropertyType> > staticgetter, TPropertyType defaultValue,
                                                                                            BindingMode defaultBindingMode = BindingMode.OneWayToSource, ValidateValueDelegate <TPropertyType> validateValue = null,
                                                                                            BindingPropertyChangedDelegate <TPropertyType> propertyChanged = null, BindingPropertyChangingDelegate <TPropertyType> propertyChanging = null,
                                                                                            CoerceValueDelegate <TPropertyType> coerceValue = null, CreateDefaultValueDelegate <BindableObject, TPropertyType> defaultValueCreator  = null)

        {
            return
                (new BindablePropertyKey(CreateAttached <TDeclarer, TPropertyType>(staticgetter, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, null, true,
                                                                                   defaultValueCreator)));
        }
Beispiel #11
0
        BindableProperty(string propertyName, Type returnType, Type declaringType, object defaultValue, BindingMode defaultBindingMode = BindingMode.OneWay,
                         ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged  = null, BindingPropertyChangingDelegate propertyChanging = null,
                         CoerceValueDelegate coerceValue     = null, BindablePropertyBindingChanging bindingChanging = null, bool isReadOnly = false, CreateDefaultValueDelegate defaultValueCreator = null)
        {
            if (propertyName == null)
            {
                throw new ArgumentNullException("propertyName");
            }
            if (ReferenceEquals(returnType, null))
            {
                throw new ArgumentNullException("returnType");
            }
            if (ReferenceEquals(declaringType, null))
            {
                throw new ArgumentNullException("declaringType");
            }

            // don't use Enum.IsDefined as its redonkulously expensive for what it does
            if (defaultBindingMode != BindingMode.Default && defaultBindingMode != BindingMode.OneWay && defaultBindingMode != BindingMode.OneWayToSource && defaultBindingMode != BindingMode.TwoWay && defaultBindingMode != BindingMode.OneTime)
            {
                throw new ArgumentException("Not a valid type of BindingMode", "defaultBindingMode");
            }
            if (defaultValue == null && Nullable.GetUnderlyingType(returnType) == null && returnType.GetTypeInfo().IsValueType)
            {
                throw new ArgumentException("Not a valid default value", "defaultValue");
            }
            if (defaultValue != null && !returnType.IsInstanceOfType(defaultValue))
            {
                throw new ArgumentException("Default value did not match return type", "defaultValue");
            }
            if (defaultBindingMode == BindingMode.Default)
            {
                defaultBindingMode = BindingMode.OneWay;
            }

            PropertyName        = propertyName;
            ReturnType          = returnType;
            ReturnTypeInfo      = returnType.GetTypeInfo();
            DeclaringType       = declaringType;
            DefaultValue        = defaultValue;
            DefaultBindingMode  = defaultBindingMode;
            PropertyChanged     = propertyChanged;
            PropertyChanging    = propertyChanging;
            ValidateValue       = validateValue;
            CoerceValue         = coerceValue;
            BindingChanging     = bindingChanging;
            IsReadOnly          = isReadOnly;
            DefaultValueCreator = defaultValueCreator;

            Dictionary <string, BindableProperty> nameToBindableProperty;

            bindablePropertyOfType.TryGetValue(declaringType, out nameToBindableProperty);
            if (null == nameToBindableProperty)
            {
                nameToBindableProperty = new Dictionary <string, BindableProperty>();
                bindablePropertyOfType.Add(declaringType, nameToBindableProperty);
            }

            if (!nameToBindableProperty.ContainsKey(propertyName))
            {
                nameToBindableProperty.Add(propertyName, this);
            }
            else
            {
                nameToBindableProperty[propertyName] = this;
            }
        }
Beispiel #12
0
 internal static BindableProperty Create(string propertyName, Type returnType, [DynamicallyAccessedMembers(DeclaringTypeMembers)] Type declaringType, object defaultValue, BindingMode defaultBindingMode, ValidateValueDelegate validateValue,
                                         BindingPropertyChangedDelegate propertyChanged, BindingPropertyChangingDelegate propertyChanging, CoerceValueDelegate coerceValue, BindablePropertyBindingChanging bindingChanging,
                                         CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return(new BindableProperty(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, bindingChanging,
                                 defaultValueCreator: defaultValueCreator));
 }
Beispiel #13
0
 /// <include file="../../docs/Microsoft.Maui.Controls/BindableProperty.xml" path="//Member[@MemberName='CreateAttached']/Docs" />
 public static BindableProperty CreateAttached(string propertyName, Type returnType, [DynamicallyAccessedMembers(DeclaringTypeMembers)] Type declaringType, object defaultValue, BindingMode defaultBindingMode = BindingMode.OneWay,
                                               ValidateValueDelegate validateValue = null, BindingPropertyChangedDelegate propertyChanged = null, BindingPropertyChangingDelegate propertyChanging = null,
                                               CoerceValueDelegate coerceValue     = null, CreateDefaultValueDelegate defaultValueCreator = null)
 {
     return(CreateAttached(propertyName, returnType, declaringType, defaultValue, defaultBindingMode, validateValue, propertyChanged, propertyChanging, coerceValue, null, false, defaultValueCreator));
 }