2011-06-20 110 views
5

我一直在寻找,但我似乎无法找到我在找什么,所以我会在这里放弃它。C#WPF如何动态设置属性设置器方法?

情况: 我有类MainWindow和MainWindowData。在MainWindowData中只有使用UpdateGUI属性定义的公共属性。

public class UpdateGUI : Attribute { } 

public class MainWindowData 
{ 
    [UpdateGUI] 
    public string TESTVAR { get; set; } 
} 

现在我想为MainWindowData中的每个属性的setter方法添加一个方法。更具体:

void OnPropertyChanged(String PropertyName); 

我想我会在主窗口的构造函数获取所有UpdateGUI属性,然后莫名其妙地添加另一种方法,但是这就是我卡住了。 我使用此代码来获取所有属性,其工作方式:

List<PropertyInfo> properties = (from pi in typeof(MainWindowData).GetProperties() 
           where pi.GetCustomAttributes(typeof(UpdateGUI), false).Any() 
           select pi).ToList(); 

这给了我,我要更新所有属性的一个不错的清单。

所以,问题是:我怎样才能让这个属性动态获得转化而来:

到:

[UpdateGUI] 
private string _TESTVAR; 
public string TESTVAR { 
    get { 
     return _TESTVAR; 
    } 
    set { 
     _TESTVAR = value; 
     OnPropertyChanged("TESTVAR"); 
    } 
} 

感谢您的帮助!这将不胜感激:)

问候

+0

+1有趣的问题,将很高兴看到这是什么出来。 –

回答

5

你在找什么在面向方面编程(AOP)的概念已经得到解决。

一个例子是in PostSharp,(此外,see details here),它可以让你写你的数据/视图模型类是这样的:

[NotifyPropertyChanged] 
public class Shape 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

public class Rectangle : Shape 
{ 
    public double Width { get; set; } 
    public double Height { get; set; } 
} 

如果你不喜欢PostSharp,我敢肯定,其他AOP框架出来有类似的功能。

编辑

我刚刚发现NotifyPropertyWeaver这可以实现这个要求,而不需要一个完整的AOP框架。

它使用Mono.Cecil的东西在编译期间注入通知代码,并且可以通过NuGet(这是我所做的)或从项目网站安装。

默认情况下,它甚至不要求属性,(它会自动计算出哪些属性和类需要变更通知),但可以明确的,也就像这样:

[NotifyProperty] 
public int FooBar { get; set; } 

一个不错的功能,我发现其中有可能声明属性之间的依赖关系。在这种情况下,只要FooBar发生变化,就会调用RaisePropertyChanged("FoobarTimesTwo")

[DependsOn("FooBar")] 
public int FoobarTimesTwo 
{ 
    get { return FooBar * 2; } 
} 
+0

+1有趣的作品。如果想要自己做这件事,详细的链接提供编码思想。 –

+0

感谢您的快速回复,这正是我需要的。可悲的是它不是免费使用,但也许我可以找出它或找到其他AOP框架。 – FrieK

0

开源框架ImpromptuInterface.MVVM使用C#4.0动态功能添加支持属性更改的自动属性。它的ImpromptuViewModel像ExpandoObject一样工作,但也有其他功能可以帮助MVVM。