我知道有一些解决方案用于实现INotifyPropertyChanged,但它们都不是那么简单:引用这个库,创建/添加这个属性,完成(我在想这里的面向方面编程)。有谁知道一个非常简单的方法来做到这一点?如果解决方案是免费的,奖励积分。
以下是一些相关链接(其中没有一个提供足够简单的答案):
答案 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>
答案 3 :(得分:2)
还有UpdateControls.NET。我没有使用它,它看起来比notifypropertyweaver更多的工作,但它可能是好的。来自网站:
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