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.
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).
Dans .NET 4.5 et plus il peut être raccourci :
private int unitsInStock;
public int UnitsInStock
{
get { return unitsInStock; }
set { SetProperty(ref unitsInStock, value);}
}
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é.
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
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.
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.
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>
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>
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:
Des informations plus utiles peuvent être trouvées ici .