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