2015-05-07 35 views
0

我有許多實現INotifyPropertyChanged接口的模型類,以便在值更改時更新UI。INotifyPropertyChanged-自動屬性上的功能

不幸的是,必須完全寫入屬性才能支持此功能。我通過在BaseClass中使用'SetPropertyValue'-Method()來減少我的代碼。

private string _title; 
public string Title 
{ 
    get { return title; } 
    set { SetPropertyValue("Title", ref _title, value); } 
} 

但隨着這樣寫的是20個物業在一個文件也不是那麼簡單的理解文件在很短的時間內容不同的自動實現的屬性。

我想要的是寫我的財產是這樣的:

[NotifyChanged] 
public string Title { get; set; } 

我已經檢查PostSharp但在免費版本只有10個班包括(這是一個愛好的項目,所以我不希望支付很多錢)。

有沒有可能將我的一個邏輯附加到C#-Compiler(作爲預編譯器)? 我希望在我的代碼的不同位置使用這樣一個特性,以減少不必要的編碼行(特別是對於自動屬性)。

or maye a VisulStudio-Extension?

+0

如果/在做MVVM時,您可能想重新考慮將視圖綁定到模型。視圖應該只知道ViewModel。所以應該實現INotifyPropertyChanged的ViewModel –

+0

是的,有很多方法。搜索引擎旨在幫助您找到它們。然而,要求SO上的鏈接是特別禁止的。 – Will

+0

我只想指出PostSharp'[NotifyPropertyChanged]'不是一個簡單的實現。每次屬性更改時都不會引發通知,但僅當控件離開對象的方法時纔會引發通知。這有兩個好處。首先是表現;當您進行更復雜的更改時,某些屬性會多次更改。如果您有其他對象觀察這些屬性並執行不重要的計算,則性能會受到影響。其次是原子性;如果您有改變對象狀態的方法,通知並不總是以對象的有效狀態觸發。 –

回答

3

嘗試Fody。它是使用專用msbuild任務在構建過程中修改IL代碼的庫。

它有大量的插件基礎,包括PropertyChanged這應該適合您的場景。 這個插件爲你提供屬性ImplementPropertyChanged,你可以應用到一個類。然後,Fody將生成對所有自動屬性實施INotifyPropertyChanged的代碼。

Second option如果您有ReSharper版本7或更高版本。它具有重構功能,可以幫助您實現INotifyPropertyChanges。例如,它可以將自動屬性轉換爲實現接口的「普通」屬性。 你可能不完全滿足你 - 這種方法可能會讓你感興趣,因爲它不涉及額外的庫和程序集修改。

+0

謝謝。 Fody會做我正在尋找的工作。 – Klaus

1

另一種選擇是Castle DynamicProxyPostSharpFody之間的區別在於DynamicProxy在運行時即時生成其代理。

+0

在這種情況下,在運行時產生這樣的代理沒有真正的好處。您的啓動性能和可移植性問題會變得更糟(在運行時無法使用創建代碼的平臺上)。 –

+0

@DanielBalas這是一個有效的答案,即使你說的是真實的,它仍然簡化了代碼(儘管我同意Fody在這裏更好) –