c# - onpropertychanged - INotifyPropertyChanged y Auto-Properties
inotifypropertychanged xamarin (5)
¿Hay alguna manera de utilizar INotifyPropertyChanged
con auto-propiedades? Tal vez un atributo u otra cosa, no es obvio para mí.
public string Demo{
get;set;
}
Para mí, las propiedades automotrices serían algo extremadamente práctico, pero casi siempre, tengo que plantear el evento PropertyChanged
si el valor de la propiedad ha sido cambiado y sin un mecanismo para hacerlo, las propiedades automáticas me resultan inútiles.
En .NET 4.5 y superior, puede hacerse algo más corto :
private int unitsInStock;
public int UnitsInStock
{
get { return unitsInStock; }
set { SetProperty(ref unitsInStock, value);}
}
Es algo que tendrías que codificar tú mismo. Lo más cercano que podría obtener sería algo así como esta implementación en Code Project que utiliza un atributo personalizado y métodos orientados a los aspectos para proporcionar esta sintaxis:
[NotifyPropertyChanged]
public class AutoWiredSource
{
public double MyProperty { get; set; }
}
Alguien propuso en Microsoft Connect un cambio a la especificación C # implementar esto:
class Person : INotifyPropertyChanged
{
// "notify" is a context keyword, same as "get" and "set"
public string Name { get; set; notify; }
}
Pero la proposal ha sido cerrada.
Intenté otras maneras de usar primero:
Esos métodos funcionan, sin embargo, todavía tengo que enturbiar los métodos de acceso de todas las propiedades en el Modelo o usar un objeto dynamic
que mata tu autocompletado al codificar. También vale la pena mencionar que WinForms no admite el enlace a objetos dinámicos, lamentablemente.
Solución
Finalmente me encontré con ReactiveUI.Fody . Es una solución fácil de usar que usa Fody y ReactiveUI. Utilicé esto en mi proyecto de WPF con éxito.
RaisePropertyChanges
código RaisePropertyChanges
requerido, RaisePropertyChanges
y ObservableAsPropertyHelper
, en tiempo de compilación.
Dependencias del proyecto
Instalé los siguientes paquetes en mi proyecto con 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>
Configuración de Fody
Deberá crear un archivo FodyWeavers.xml en el nivel superior de su proyecto para que se vea así:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<ReactiveUI/>
</Weavers>
Uso
Simplemente establece sus clases de modelo para heredar fuera de ReactiveObject
y agrega el atributo [Reactive]
sobre cualquier propiedad que desee notificar de cambios.
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
namespace name.domain.some{
class SomeClass : ReactiveObject {
[Reactive]
public string SomeProperty { get; set; }
}
}
¡Trabajo hecho ! Reconstruya su proyecto y verifique la ventana de salida en Visual Studio. Debería ver algunas líneas emitidas desde Fody a medida que procesa las clases de modelo anotadas e inyecta el código repetitivo apropiado. Debería verse algo como esto:
Informacion adicional
Puede encontrar más información útil here .
No hay un mecanismo incorporado para hacer esto. Algo como PostSharp probablemente podría agregar algo como esto para ti (o HyperDescriptor Mark Gravell, si solo estás interesado en hacer consciente este enlace de datos).
INotifyPropertyChanged
y DependencyProperties ciertamente han hecho que las propiedades sean mucho menos divertidas. La mejor solución que he encontrado son buenos fragmentos. Tales como los que vienen en el proyecto contrib de Silverlight