2011-06-20 144 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。