2014-09-25 59 views
0

我的目標是從生成的EntityFramework模型中進行TwoWay綁定。 對生成的實體模型中的屬性實現NotifyPropertyChanged的最佳方式是什麼? 例如,假設我有從數據庫這個實體:在EF生成的模型上實現NotifyPropertyChange以實現雙向綁定

public partial class Survey 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool Answer { get; set; } 
} 

我然後創建一個視圖模型...

public class SurveyViewModel : ViewModelBase 
{ 
    private Survey _survey = new Survey(); 
    public Survey 
    { 
     get { return _survey; } 
     set 
     { 
      _survey = value; 
     } 
    } 
} 

我怎麼能實現雙向綁定除了爲每一個寫依賴屬性財產實體模型,像這樣......

//below the declaration of the Survey entity in the viewmodel 
public string FirstName 
{ 
    get { return Survey.FirstName; } 
    set 
    { 
     Survey.FirstName = value; 
     NotifyPropertyChanged("FirstName"); 
    } 
} 
//This works but is very time consuming for large models    

讓我知道,如果我嘗試這個錯誤...

+0

你的DTO通常不是你的模型,但也有很多的這個已經的問題。 http://stackoverflow.com/questions/18835827/how-to-implement-inotifypropertychanged-on-entity-framework-entity http://stackoverflow.com/questions/14132349/implement-inotifypropertychanged-on-generated-entity-framework實際上,你正在尋找的是AutoMapper。當您需要與數據庫進行通信時,您應該將模型映射到您的DTO,反之亦然。 – TyCobb 2014-09-25 01:06:05

回答

0

PropertyChanged.Fody可能是你在找什麼:

// Non-auto generated partial class declaration 

[ImplementPropertyChanged] 
public partial class Survey 
{ 

} 
0

正如評論說TyCobb,這個問題已經被反覆問及的結果仍然是相同的......這裏是一個總結。

當然還有其他方法污染你的數據模型與UI容納 功能,如INotifyPropertyChanged的MVVM口頭禪教導我們 它是視圖模型的工作與UI和 數據模型交互應該保持儘可能純粹(POCO)。

那麼是什麼?我們如何保持MVVM,但避免在視圖模型中暴露各個屬性的樣板代碼?

根據經驗,調用RaisePropertyChanged不僅用於屬性設置器,而且可用於手動引發已修改其屬性的模型的屬性更改,從而導致UI更新。

下面是一個代碼示例...

public class SurveyViewModel : INotifyPropertyChanged 
{ 
    private Survey _survey; 

    public Survey Survey 
    { 
     get { return _survey; } 
     set 
     { 
      _survey = value; 
      RaisePropertyChanged(() => Survey); 
     } 
    } 

    public void ModifySurvey() 
    { 
     // Modify a property of the model. 
     Survey.FirstName = "Modified"; 
     // Make other modifications here... 

     // Notify property changed 
     RaisePropertyChanged(() => Survey); 
    } 
} 
相關問題