onpropertychanged c# .net vb.net

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.



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

ReactiveUI.Fody

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