// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.ComponentModel; namespace CommunityToolkit.Mvvm.ComponentModel; /// /// An attribute that indicates that a given field should be wrapped by a generated observable property. /// In order to use this attribute, the containing type has to implement the interface /// and expose a method with the same signature as . If the containing /// type also implements the interface and exposes a method with the same signature as /// , then this method will be invoked as well by the property setter. /// /// This attribute can be used as follows: /// /// partial class MyViewModel : ObservableObject /// { /// [ObservableProperty] /// private string name; /// /// [ObservableProperty] /// private bool isEnabled; /// } /// /// /// And with this, code analogous to this will be generated: /// /// partial class MyViewModel /// { /// public string Name /// { /// get => name; /// set => SetProperty(ref name, value); /// } /// /// public bool IsEnabled /// { /// get => name; /// set => SetProperty(ref isEnabled, value); /// } /// } /// /// /// /// The generated properties will automatically use the UpperCamelCase format for their names, /// which will be derived from the field names. The generator can also recognize fields using either /// the _lowerCamel or m_lowerCamel naming scheme. Otherwise, the first character in the /// source field name will be converted to uppercase (eg. isEnabled to IsEnabled). /// [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public sealed class ObservablePropertyAttribute : Attribute { }