/// <summary> /// Attaches the property as a non-attached property on the specified type. /// </summary> /// <typeparam name="TOwner">The owner type.</typeparam> /// <returns>The property.</returns> public StyledProperty <TValue> AddOwner <TOwner>() where TOwner : IPerspexObject { var result = new StyledProperty <TValue>(this, typeof(TOwner)); PerspexPropertyRegistry.Instance.Register(typeof(TOwner), result); return(result); }
/// <summary> /// Registers a <see cref="PerspexProperty"/>. /// </summary> /// <typeparam name="TOwner">The type of the class that is registering the property.</typeparam> /// <typeparam name="TValue">The type of the property's value.</typeparam> /// <param name="name">The name of the property.</param> /// <param name="defaultValue">The default value of the property.</param> /// <param name="inherits">Whether the property inherits its value.</param> /// <param name="defaultBindingMode">The default binding mode for the property.</param> /// <param name="validate">A validation function.</param> /// <param name="notifying"> /// A method that gets called before and after the property starts being notified on an /// object; the bool argument will be true before and false afterwards. This callback is /// intended to support IsDataContextChanging. /// </param> /// <returns>A <see cref="StyledProperty{TValue}"/></returns> public static StyledProperty<TValue> Register<TOwner, TValue>( string name, TValue defaultValue = default(TValue), bool inherits = false, BindingMode defaultBindingMode = BindingMode.OneWay, Func<TOwner, TValue, TValue> validate = null, Action<IPerspexObject, bool> notifying = null) where TOwner : IPerspexObject { Contract.Requires<ArgumentNullException>(name != null); var metadata = new StyledPropertyMetadata<TValue>( defaultValue, validate: Cast(validate), defaultBindingMode: defaultBindingMode); var result = new StyledProperty<TValue>( name, typeof(TOwner), metadata, inherits, notifying); PerspexPropertyRegistry.Instance.Register(typeof(TOwner), result); return result; }