File: System\ComponentModel\BindableAttribute.cs
Web Access
Project: src\src\libraries\System.ComponentModel.TypeConverter\src\System.ComponentModel.TypeConverter.csproj (System.ComponentModel.TypeConverter)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics.CodeAnalysis;
 
namespace System.ComponentModel
{
    /// <summary>
    /// Specifies whether a property is appropriate to bind data to.
    /// </summary>
    [AttributeUsage(AttributeTargets.All)]
    public sealed class BindableAttribute : Attribute
    {
        /// <summary>
        /// Specifies that a property is appropriate to bind data to. This
        /// <see langword='static '/>field is read-only.
        /// </summary>
        public static readonly BindableAttribute Yes = new BindableAttribute(true);
 
        /// <summary>
        /// Specifies that a property is not appropriate to bind data to.
        /// This <see langword='static '/>field is read-only.
        /// </summary>
        public static readonly BindableAttribute No = new BindableAttribute(false);
 
        /// <summary>
        /// Specifies the default value for the <see cref='System.ComponentModel.BindableAttribute'/>, which
        /// is <see cref='System.ComponentModel.BindableAttribute.No'/>. This <see langword='static '/>field is
        /// read-only.
        /// </summary>
        public static readonly BindableAttribute Default = No;
 
        private readonly bool _isDefault;
 
        /// <summary>
        /// Initializes a new instance of the <see cref='System.ComponentModel.BindableAttribute'/> class.
        /// </summary>
        public BindableAttribute(bool bindable) : this(bindable, BindingDirection.OneWay)
        {
        }
 
        /// <summary>
        /// Initializes a new instance of the <see cref='System.ComponentModel.BindableAttribute'/> class.
        /// </summary>
        public BindableAttribute(bool bindable, BindingDirection direction)
        {
            Bindable = bindable;
            Direction = direction;
        }
 
        /// <summary>
        /// Initializes a new instance of the <see cref='System.ComponentModel.BindableAttribute'/> class.
        /// </summary>
        public BindableAttribute(BindableSupport flags) : this(flags, BindingDirection.OneWay)
        {
        }
 
        /// <summary>
        /// Initializes a new instance of the <see cref='System.ComponentModel.BindableAttribute'/> class.
        /// </summary>
        public BindableAttribute(BindableSupport flags, BindingDirection direction)
        {
            Bindable = (flags != BindableSupport.No);
            _isDefault = (flags == BindableSupport.Default);
            Direction = direction;
        }
 
        /// <summary>
        /// Gets a value indicating whether a property is appropriate to bind data to.
        /// </summary>
        public bool Bindable { get; }
 
        /// <summary>
        /// Gets a value indicating the direction(s) this property be bound to data.
        /// </summary>
        public BindingDirection Direction { get; }
 
        public override bool Equals([NotNullWhen(true)] object? obj)
        {
            if (obj == this)
            {
                return true;
            }
 
            return obj is BindableAttribute other && other.Bindable == Bindable;
        }
 
        public override int GetHashCode() => Bindable.GetHashCode();
 
        public override bool IsDefaultAttribute() => Equals(Default) || _isDefault;
    }
}