13 mars 2019

Fody / PropertyChanged

Fody est un "Weaver", c'est à dire qu'il va injecté du code par lien. Il est l'outil indispensable pour les développeurs C# MVVM (WPF/UWP/XAMARIN). Fody/PropertyChanged Injecte le code qui déclenche l'événement PropertyChanged dans les paramètres des propriétés des classes qui implémentent INotifyPropertyChanged. Ainsi, nous sommes débarrassés de la quantité importante de code de "plomberie".

Toutes les classes qui implémentent l'interface INotifyPropertyChanged auront leurs propriétés modifiées par injection de code.

Avant :
public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    
    public string GivenNames { get; set; }
    public string FamilyName { get; set; }
    public string FullName => $"{GivenNames} {FamilyName}";
}
Après :
public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    string givenNames;
    public string GivenNames
    {
        get => givenNames;
        set
        {
            if (value != givenNames)
            {
                givenNames = value;
                OnPropertyChanged(InternalEventArgsCache.GivenNames);
                OnPropertyChanged(InternalEventArgsCache.FullName);
            }
        }
    }

    string familyName;
    public string FamilyName
    {
        get => familyName;
        set 
        {
            if (value != familyName)
            {
                familyName = value;
                OnPropertyChanged(InternalEventArgsCache.FamilyName);
                OnPropertyChanged(InternalEventArgsCache.FullName);
            }
        }
    }

    public string FullName => $"{GivenNames} {FamilyName}";

    protected void OnPropertyChanged(PropertyChangedEventArgs eventArgs)
    {
        PropertyChanged?.Invoke(this, eventArgs);
    }
}

internal static class InternalEventArgsCache
{
    internal static PropertyChangedEventArgs FamilyName = new PropertyChangedEventArgs("FamilyName");
    internal static PropertyChangedEventArgs FullName = new PropertyChangedEventArgs("FullName");
    internal static PropertyChangedEventArgs GivenNames = new PropertyChangedEventArgs("GivenNames");
}
Un wiki complet (en anglais) sur son utilisation est disponible.