CommunityToolkit / dotnet

.NET Community Toolkit is a collection of helpers and APIs that work for all .NET developers and are agnostic of any specific UI platform. The toolkit is maintained and published by Microsoft, and part of the .NET Foundation.
https://docs.microsoft.com/dotnet/communitytoolkit/?WT.mc_id=dotnet-0000-bramin
Other
3.07k stars 299 forks source link

Add support for combining NotifyParentPropertyAttribute and ObservablePropertyAttribute #602

Open stcmz opened 1 year ago

stcmz commented 1 year ago

Overview

System.ComponentModel.NotifyParentPropertyAttribute can only decorate a property but a ObservableProperty must be defined as a field so that a property can be generated automatically.

To allow them to work together, we should either provide a CommunityToolkit implementation of NotifyParentPropertyAttribute or allow ObservablePropertyAttribute to be used with a partial property (https://github.com/CommunityToolkit/dotnet/issues/555).

For now, the latter is infeasible as C# does not allow partial properties.

API breakdown

namespace CommunityToolkit.Mvvm.ComponentModel;

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public sealed class NotifyParentPropertyAttribute : Attribute
{
    public NotifyParentPropertyAttribute(bool notifyParent)
    {
        NotifyParent = notifyParent;
    }

    public bool NotifyParent { get; }
}

Usage example

public partial class ChildModel : ObservableObject
{
    [ObservableProperty]
    [NotifyParentChanged(true)]
    private string _name;
}

public partial class ParentModel : ObservableObject
{
    [ObservableProperty]
    private ChildModel _child = new ();
}

When the Child.Name property gets updated, the ParentModel should be notified for the change of the Child property, i.e., OnPropertyChanged(nameof(Child)) should be called.

var parentModel = new ParentModel();
parentModel.Child.Name = "something"; // should call OnPropertyChanged(nameof(Child))

Breaking change?

No

Alternatives

Currently one has to choose between [NotifyParentChanged(true)] and [ObservableProperty].

Additional context

No response

Help us help you

Yes, but only if others can assist