.net aop inotifypropertychanged

.net - La forma más sencilla de lograr la notificación automática del cambio de propiedad.



aop inotifypropertychanged (6)

Aquí hay un artículo que muestra cómo manejar esto a través de PostSharp .

Sé que existen soluciones para implementar INotifyPropertyChanged, pero ninguna de ellas es tan simple como: referencia esta biblioteca, crear / agregar este atributo, hecho (estoy pensando en Programación Orientada a Aspectos aquí). ¿Alguien sabe de una manera realmente simple de hacer esto? Puntos de bonificación si la solución es gratuita.

Aquí hay algunos enlaces relevantes (ninguno de los cuales proporciona una respuesta lo suficientemente simple):


Hay un proyecto llamado Polymod . Que ofrece lo que buscas. Tiene algunas características interesantes, como la definición de fórmulas de actualización automática. Por ejemplo, si Sum = A + B, entonces se llama a PropertyChanged en Sum cuando se cambia A o B.

También funciona con el motor de reglas fuera de la caja para darle validación también. Debido a que es extensible, también es posible utilizar otros marcos de validación.

Programación orientada a aspectos en su máxima expresión!


Pruebe esto https://github.com/Fody/PropertyChanged

Tejerá todas las propiedades de los tipos que implementan INotifyPropertyChanged e incluso maneja dependencias.

Tu codigo

public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public string GivenNames { get; set; } public string FamilyName { get; set; } public string FullName { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } }

Lo que se compila

public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string givenNames; public string GivenNames { get { return givenNames; } set { if (value != givenNames) { givenNames = value; OnPropertyChanged("GivenNames"); OnPropertyChanged("FullName"); } } } private string familyName; public string FamilyName { get { return familyName; } set { if (value != familyName) { familyName = value; OnPropertyChanged("FamilyName"); OnPropertyChanged("FullName"); } } } public string FullName { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } public void OnPropertyChanged(string propertyName) { var propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }

O puede usar atributos para un control más preciso.


También hay UpdateControls.NET . No lo he usado, y parece más trabajo que notificar a un propietario de una empresa, pero podría ser bueno. Desde el sitio web:

Enlace de datos sin INotifyPropertyChanged

Update Controls no requiere que implemente INotifyPropertyChanged o declare una DependencyProperty. Conecta los controles directamente a las propiedades de CLR. Descubre dependencias sobre datos a través de capas de código intermedio. Esto lo hace perfecto para el patrón Modelo / Vista / Modelo de Vista; no se necesita ningún código adicional en el ViewModel, que se encuentra entre el Modelo y la Vista.

Envuelva el DataContext de su ventana. El contenedor no solo implementa INotifyPropertyChanged para todas las propiedades de su objeto, sino que también detecta automáticamente sus dependencias en otras propiedades. No hay una clase base o interfaz para implementar.



La respuesta de Simon es la solución, pero aquí está mi código y una captura de pantalla como referencia. Estoy usando Prism (con MEF - ignora los atributos de la clase), así que heredo de NotificationObject para INotifyPropertyChanged. (Define un método RaisePropertyChanged , por lo que tiene que decirle a NotifyPropertyWeaver que en su archivo de proyecto).

La clase

using System.ComponentModel.Composition; using Microsoft.Practices.Prism.ViewModel; [Export] [PartCreationPolicy(CreationPolicy.NonShared)] public class SignControllerViewModel : NotificationObject { public string Uri { get; set; } }

El archivo de proyecto

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- snipped --> <UsingTask TaskName="NotifyPropertyWeaverMsBuildTask.WeavingTask" AssemblyFile="$(SolutionDir)lib/NotifyPropertyWeaverMsBuildTask.dll" /> <Target Name="AfterBuild"> <NotifyPropertyWeaverMsBuildTask.WeavingTask TargetPath="$(TargetPath)" TryToWeaveAllTypes="true" EventInvokerName="RaisePropertyChanged" MessageImportance="High"/> </Target> </Project>

El Código Reflector