2013-01-25 40 views
2

MVVM涉及大量寫作樣板代碼,如多個帖子中所述。不少快捷操作似乎提供運行時的評價,但我不知道是否有它使用反射來生成的C#代碼,即免費的實用工具:自動生成可編譯的C# - 實現INotifyPropertyChanged的包裝類

Class A 
{ 
    int I {get;set;} 
    ICollection C {get; set;} 
} 

會給我一個文件或剪貼板含有類似

Class ViewModelA : INotifyPropertyChanged 
{ 
    readonly A _a; 
    private ObservableCollection _c; 
    ViewModelA(ClassA a) 
    { 
     _a=a; 
     _c=new ObservableCollection(a.C); 
    } 
    int I 
    { 
     get {return _a.I;} 
     set 
     { 
     (if _a.I != value) 
     { 
      _a.I = value; 
      NotifyPropertyChanged("I"); 
     } 
     } 
    } 
} 

感謝

回答

3

PropertyChanged.Fody是我用來處理這個問題。

它已經從大多數MVVM框架中識別基類,並調用適當的方法來進行通知。否則,它會找到任何實現INPC的類並將其轉換爲您。

我之所以喜歡Fody而不是PostSharp,是因爲Fody將IL添加到您的程序集中,然後自行清理,因此您不需要依賴Fody或任何其他程序集,並且您的代碼是自包含的。 PostSharp只是添加攔截器,然後調用PostSharp庫,然後回到你添加的任何攔截器。這在運行時較慢,您需要依賴PostSharp庫。

Plus Fody是免費且開源的。

2

可以實現使用編譯後修改IL應用程序(如PostSharp),或在使用依賴注入運行時(見The Best Implementation of INotifyPropertyChanged Ever)這種效果。前者實際上生成IL(但不是免費的),後者不會改變你的IL或產生任何東西,而是攔截你的事件設置器併爲你提出PropertyChanged事件。另外,如果你在做WPF MVVM,你應該查看INPC和依賴屬性的性能。我已經看到時間表明後者比較快。

+0

+1適用於PostSharp。 'NotifyPropertyChanged'問題是文檔中的典型示例。 –

相關問題