web-dev-qa-db-fra.com

INotifyPropertyChanged et Auto-Properties

Existe-t-il un moyen d'utiliser INotifyPropertyChanged avec des propriétés automatiques? Peut-être un attribut ou quelque chose d'autre, pas évident pour moi.

public string Demo{
    get;set;
}

Pour moi, les propriétés automatiques seraient une chose extrêmement pratique, mais presque toujours, je dois déclencher l'événement PropertyChanged- si la valeur de la propriété a été modifiée et sans mécanisme pour le faire, les propriétés automatiques sont inutiles pour moi.

49
HCL

Il n'y a pas de mécanisme intégré pour ce faire. Quelque chose comme PostSharp pourrait probablement ajouter quelque chose comme ça pour vous (ou Mark Gravell HyperDescriptor , si vous êtes simplement intéressé à rendre cette liaison de données sensible).

9
Adam Robinson

Dans .NET 4.5 et plus il peut être raccourci :

private int unitsInStock;
public int UnitsInStock
{
    get { return unitsInStock; }
    set { SetProperty(ref unitsInStock, value);}
}
13
crea7or

C'est quelque chose que vous auriez à vous coder. Le plus proche que vous pourriez obtenir serait quelque chose comme cette implémentation sur Code Project qui utilise un attribut personnalisé et des méthodes orientées aspect pour donner cette syntaxe:

[NotifyPropertyChanged] 
public class AutoWiredSource
{ 
   public double MyProperty { get; set; } 
}

Quelqu'un a proposé une fois sur Microsoft Connect une modification de la spécification C # implémenter ceci:

class Person : INotifyPropertyChanged
{
    // "notify" is a context keyword, same as "get" and "set"
    public string Name { get; set; notify; }
}

Mais le proposition est maintenant fermé.

11
ChrisF

INotifyPropertyChanged et DependencyProperties ont certainement rendu les propriétés beaucoup moins amusantes. La meilleure solution que j'ai trouvée est de bons extraits. Tels que ceux qui viennent dans le projet Silverlight contrib

2
Matt Greer

J'ai d'abord essayé d'autres façons en utilisant:

Ces méthodes fonctionnent, mais j'ai encore dû brouiller les méthodes d'accesseur de toutes les propriétés du modèle ou utiliser un objet dynamic qui tue votre auto-complétion lors du codage. Il convient également de mentionner que WinForms ne prend malheureusement pas en charge la liaison à des objets dynamiques.

Solution

Finalement, je suis tombé sur ReactiveUI.Fody . C'est une solution simple à utiliser utilisant Fody et ReactiveUI. J'ai utilisé cela avec succès dans mon projet WPF.

Il tisse dans le code passe-partout requis, RaisePropertyChanges et ObservableAsPropertyHelper, au moment de la compilation.

Dépendances du projet

https://github.com/kswoll/ReactiveUI.Fody

J'ai installé les packages suivants dans mon projet avec NuGet:

<packages>
  <package id="Fody" version="2.0.7" targetFramework="net452" developmentDependency="true" />
  <package id="reactiveui" version="7.4.0" targetFramework="net452" />
  <package id="ReactiveUI.Fody" version="2.2.11" targetFramework="net452" />
  <package id="reactiveui-core" version="7.4.0" targetFramework="net452" />
  <package id="Rx-Core" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Linq" version="2.2.5" targetFramework="net452" />
  <package id="Rx-Main" version="2.2.5" targetFramework="net452" />
  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net452" />
  <package id="Rx-XAML" version="2.2.5" targetFramework="net452" />
  <package id="Splat" version="1.6.0" targetFramework="net452" />
</packages>

Configuration de Fody

Vous devrez créer un fichier FodyWeavers.xml au niveau supérieur de votre projet pour qu'il ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <ReactiveUI/>
</Weavers>

Usage

Vous venez de définir vos classes Model pour hériter de ReactiveObject et ajouter le [Reactive] attribut au-dessus de toute propriété que vous souhaitez notifier des modifications.

using ReactiveUI;
using ReactiveUI.Fody.Helpers;

namespace name.domain.some{
    class SomeClass : ReactiveObject {
        [Reactive]
        public string SomeProperty { get; set; }
    }
}

Travail effectué ! Reconstruisez votre projet et vérifiez la fenêtre de sortie dans Visual Studio. Vous devriez voir des lignes sortir de Fody pendant qu'il traite vos classes de modèle annotées et injecte le code passe-partout approprié. Ça devrait ressembler a quelque chose comme ca:

enter image description here

Plus d'infos

Des informations plus utiles peuvent être trouvées ici .

1
JavaJedi