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