2011-09-14 38 views
5

隨着Caliburn.Micro我想知道暴露EF4實體作爲ViewModel屬性的優點和缺點(一種技術討論hereand here)。這使我可以避免爲每個字段寫入getter和setter(請參閱下面的OneCustomer)。缺點是我需要在XAML中編寫所有綁定語句(在LastName不在ViewModel中,但確實需要XAML綁定)。如果我堅持使用每個字段的屬性填充ViewModel的規定技巧(如下面的FirstName),我最終必須編寫大量額外的代碼才能調用NotifyOfProperyChange。該應用程序將會非常大。 我應該公開每個實體作爲ViewModel的屬性嗎?綁定EF4與Caliburn.Micro:我應該公開我的實體作爲ViewModel的屬性?

在我的視圖模型:

private MyEntities _context = new MyEntities(); 
private BindableCollection<Customer> _custBindableCollection; 
private Customer _oneCustomer; 
private string _firstName; 

public void Load() 
{ 
    _custBindableCollection = new BindableCollection<Customer>(_context.Customers.Where(row => row.CustomerType == "FOO")); 
    AllCustomers = _custBindableCollection; 
    _oneCustomer = _custBindableCollection.FirstOrDefault(); 
    FirstName = _oneCustomer.FirstName; 
    OneCustomer = _oneCustomer; 
} 

public BindableCollection<Customer> AllCustomers 
{ 
get { return _custBindableCollection;} 
set {_custBindableCollection = value; 
     NotifyOfPropertyChange(() => AllCustomers);} 
} 

public Customer OneCustomer 
{ 
get { return _oneCustomer;} 
set { _oneCustomer = value; 
     NotifyOfPropertyChange(() => OneCustomer);} 
} 

public string FirstName 
{ 
    get { return _firstName; } 
    set { 
     _firstName = value; 
     _oneCustomer.FirstName = value; 
     NotifyOfPropertyChange(() => FirstName); 
     NotifyOfPropertyChange(() => CanSaveChanges); 
    } 
} 

public void SaveChanges() 
{ _context.SaveChanges(); } 

public bool CanSaveChanges { get { return IsValid; } } 

筆者認爲:

<StackPanel> 
<StackPanel Orientation="Horizontal"> 
    <Label Content="First Name:" /> 
    <TextBox x:Name="FirstName" /> 
</StackPanel> 
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=OneCustomer}"> 
    <Label Content="Last Name:" /> 
    <TextBox x:Name="LastName" Text="{Binding LastName}" /> 
</StackPanel> 
<Button Content="Load Data" x:Name="Load" /> 
<Button Content="Save" x:Name="SaveChanges" /> 
<DataGrid x:Name="AllCustomers" /> 

在此先感謝。

回答

5

隨着Caliburn.Micro我想知道曝露出 EF4實體視圖模型(這裏討論 和這裏的技術)的性能的優劣。

我不確定利弊,但我可以告訴你兩種方法都被使用。例如,採用一個簡單的登錄屏幕,通常我將UserName屬性放在ViewModel上,但在表單更復雜的情況下,ViewModel可以聚合其他ViewModel(顯示模型)來完成相同的操作。 CM不會影響優點/缺點,因爲它更多的是MVVM的問題,有什麼優點/缺點。 CM會幫助你對兩者都有約束力。

  • 如果您在ViewModel上有一個名爲CustomerName的屬性,只需將名稱 命名爲TextBox x:name =「CustomerName」。
  • 如果您在ViewModel上有一個名爲Customer的類 的實例,請將該文本框命名爲x:name =「Customer_Name」,同樣,CM 將處理綁定。

    <TextBox x:Name="LastName" Text="{Binding LastName}" /> 
    

    你不需要設置的DataContext上的StackPanel:

從上面的XAML

左右。相反:

<TextBox x:Name="OneCustomer_LastName"/> 

一兩件事,可以使結合數據形和DataGrid中更容易跟隨,你的數據在屏幕上表現的方式創建顯示模型的方法。

這是我的意見,但我個人不會直接綁定到EF/Linq實體。相反,我將創建一個顯示模型來表示該實體以及我希望如何顯示它,並使用AutoMapper來執行映射。在很多情況下,它是一對一的映射。這可能看起來像是浪費時間,但它具有優勢,尤其是對於更復雜的數據模型佈局,顯示模型允許您將數據展平以用於顯示目的,並將屬性設置爲驗證而不會將其粘貼在數據模型實體上。有關更多信息,請參閱ASP.NET MVC in Action書中的章節。

+0

這是很棒的信息。特別是CM會議將下劃線解釋爲點符號。我一定會檢查出AutoMapper和MVC書籍。一個小問題,雖然...應該實體屬性更新在setters(值),或者我應該等到保存點擊並一次全部更新?再次感謝。 – DeveloperDan

+0

你問的是什麼時候堅持數據庫,當一個屬性值改變與用戶點擊保存? –

+0

不,我會堅持保存(矮胖不健談的規則)。我在想的是,如果我不公開這個實體,我可以等到Save來更新所有的實體屬性。但現在我認爲這是沒有道理的,因爲即使只有一個值被更改,我也必須更新所有值。所以,我已經回答了我自己的問題 - 我會保留setter中的實體屬性/字段更新。 – DeveloperDan

3

由於暴露實體還有其他優點(例如,通過屬性進行驗證),所以我個人直接暴露它們。

但我想正確的答案是「它取決於」,因爲總是有一些缺陷(主要是建築)。

順便說一句:你可以調用文本框「OneCustomer_LastName」和C.M的約定綁定將工作。

+0

我希望我能接受兩個答案。謝謝你的幫助。 – DeveloperDan

相關問題