实现财产变更自动通知的最简单方法

时间:2011-01-17 18:17:57

标签: .net aop inotifypropertychanged

我知道有一些解决方案用于实现INotifyPropertyChanged,但它们都不是那么简单:引用这个库,创建/添加这个属性,完成(我在想这里的面向方面编程)。有谁知道一个非常简单的方法来做到这一点?如果解决方案是免费的,奖励积分。

以下是一些相关链接(其中没有一个提供足够简单的答案):

6 个答案:

答案 0 :(得分:30)

试试这个 https://github.com/Fody/PropertyChanged

它将编织实现INotifyPropertyChanged的所有类型属性,甚至可以处理依赖项。

您的代码

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);
        }
    }

}

编译什么

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));    
        }
    }
}

或者您可以使用属性进行更精细的控制。

答案 1 :(得分:3)

这是一篇显示how to handle this via PostSharp的文章。

答案 2 :(得分:3)

Simon's answer是解决方案,但这是我的代码和截图供参考。我正在使用Prism(使用MEF - 忽略类中的属性),因此我从NotificationObject继承了INotifyPropertyChanged。 (它定义了RaisePropertyChanged方法,因此您必须在项目文件中告知NotifyPropertyWeaver。)

班级

using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.ViewModel;

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class SignControllerViewModel : NotificationObject
{
    public string Uri { get; set; }
}

项目文件

<?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>

反射器代码

Code after INPC has been weaved into it.

答案 3 :(得分:2)

还有UpdateControls.NET。我没有使用它,它看起来比notifypropertyweaver更多的工作,但它可能是好的。来自网站:

没有INotifyPropertyChanged的数据绑定

Update Controls不要求您实现INotifyPropertyChanged或声明DependencyProperty。它将控件直接连接到CLR属性。它通过中间代码层发现对数据的依赖性。这使得它非常适合Model / View / ViewModel模式; ViewModel中不需要额外的代码,它位于Model和View之间。

包装窗口的DataContext。包装器不仅为所有对象的属性实现INotifyPropertyChanged,还自动检测它们对其他属性的依赖性。没有要实现的基类或接口。

答案 4 :(得分:2)

有一个名为Polymod的项目。哪个提供你想要的东西。它确实有一些很酷的功能,如定义自我更新公式。例如。如果Sum = A + B,则在A或B更改时调用PropertyChanged。

它也可与开箱即用的Rules Engine一起使用,以便为您提供验证。 因为它是可扩展的,所以也可以使用其他验证框架。

面向方面的编程处于最佳状态!

答案 5 :(得分:1)

还有KindOfMagic,使用起来非常简单。只需创建一个“魔术”属性并应用它。 https://www.nuget.org/packages/KindOfMagic