using System; using BLToolkit.Common; using BLToolkit.TypeBuilder.Builders; namespace BLToolkit.TypeBuilder { /// /// This attribute allows to control generation of PropertyChanged notification at class level /// [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class)] public sealed class PropertyChangedAttribute : AbstractTypeBuilderAttribute { /// /// Specifies default generation options should be used for PropertyChanged notification /// public PropertyChangedAttribute() :this(Common.Configuration.NotifyOnEqualSet) { } /// /// This constructor allows control of PropertyChanged code generation /// /// See public PropertyChangedAttribute(bool notifyOnEqualSet) :this(notifyOnEqualSet, true) { } /// /// This constructor allows control of PropertyChanged code generation /// /// See /// See public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals) :this(notifyOnEqualSet, useReferenceEquals, true) { } /// /// This constructor allows control of PropertyChanged code generation /// /// See /// See /// See public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals, bool skipSetterOnNoChange) { _notifyOnEqualSet = notifyOnEqualSet; _useReferenceEquals = useReferenceEquals; _skipSetterOnNoChange = skipSetterOnNoChange; } private bool _notifyOnEqualSet; /// /// Controls whether OnPropertyChanged notifications are sent when current value is same as new one. /// /// Default value controlled via and by default is set to false /// public bool NotifyOnEqualSet { get { return _notifyOnEqualSet; } set { _notifyOnEqualSet = value; } } private bool _useReferenceEquals; /// /// Specifies if Object.ReferenceEquals should be used for equality comparison of current and new value /// for reference types. If value type implements op_Inequality, UseReferenceEquals is ignored. /// public bool UseReferenceEquals { get { return _useReferenceEquals; } set { _useReferenceEquals = value; } } private bool _skipSetterOnNoChange; /// /// Specifies whether call to setter is made when current value is same as new one /// public bool SkipSetterOnNoChange { get { return _skipSetterOnNoChange; } set { _skipSetterOnNoChange = value; } } public override IAbstractTypeBuilder TypeBuilder { get { return new PropertyChangedBuilder(_notifyOnEqualSet, _useReferenceEquals, _skipSetterOnNoChange); } } } }