我知道有一些解决方案可以实现INotifyPropertyChanged,但它们都不如这样简单:引用此库,创建/添加此属性,完成(我在考虑面向方面的编程)。有没有人知道一个真正简单的方法来做到这一点?如果解决方案是免费的,那就更好了。
以下是一些相关链接(其中没有提供足够简单的答案):
我知道有一些解决方案可以实现INotifyPropertyChanged,但它们都不如这样简单:引用此库,创建/添加此属性,完成(我在考虑面向方面的编程)。有没有人知道一个真正简单的方法来做到这一点?如果解决方案是免费的,那就更好了。
以下是一些相关链接(其中没有提供足够简单的答案):
试一下这个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));
}
}
}
或者你可以使用属性来进行更精细的控制。
这里有一篇文章,展示了如何通过PostSharp处理此问题。
这里是我的代码和截图供参考,Simon的回答是解决方案。我正在使用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>
还有一个UpdateControls.NET。我没有使用过它,看起来比notifypropertyweaver更加繁琐,但可能很不错。以下是该网站的介绍:
Update Controls不需要你实现INotifyPropertyChanged或声明DependencyProperty。它直接连接控件到CLR属性。通过中间代码层发现数据依赖关系。这使其非常适合模型/视图/视图模型模式;在ViewModel中不需要额外的代码,它位于Model和View之间。
包装您窗口的DataContext。这个包装器不仅为您对象的所有属性实现了INotifyPropertyChanged,而且还自动检测它们对其他属性的依赖关系。没有基类或接口需要实现。