簡體   English   中英

將實體框架實體綁定到 Window Forms 控件是否可以接受?

[英]Is it acceptable to bind Entity Framework entities to Window Forms controls?

我有兩個實體:第一個是 SalesOrder,第二個是 SalesOrderDetails。 在 SalesOrder 實體中,我有一個跟蹤 SalesOrderDetails 的 ObservableListSource 列表類型。 實體看起來像這樣:

public class SalesOrder{

   public int Id {get; set;}

   public DateTime Date {get; set;}

   ...

   public virtual ObservableListSource<SalesOrderDetails> OrderDetails { get; set; } 

   publi SalesOrder()
   {
      OrderDetails =  new ObservableListSource<SalesOrderDetails>()
   }   
}

public class SalesOrderDetails{

   public int Id { get; set; }

   public int Quantity { get; get; }

   public decimal Price { get; set; }

   ...
}

ObservableListSource 擴展了 ObservableCollection 並實現了 IListSource。 GetList 方法返回一個與 ObservableCollection 保持同步的 bindingList。 GetList 方法是在 System.Data.Entity 程序集中定義的擴展方法。 ObservableListSource 看起來像這樣:

public class ObservableListSource<T> : ObservableCollection<T>, IListSource
           where T : class
 {
    private IBindingList _bindingList;

    bool IListSource.ContainsListCollection { get { return false; } }

    IList IListSource.GetList()
    {
          return _bindingList ?? (_bindingList = this.ToBindingList());
    }
}

為了將 SalesOrder 和 SalesOrderDetails 實體綁定到我的表單,我使用了兩個綁定源控件:salesOrderBindingSource 和 salesOrderDetailsBindingSource。 綁定看起來像這樣:

salesOrderBindingSource.DataSource = SalesOrder;
salesOrderDetailsBindingSource.DataSource = salesOrderBindingSource;
salesOrderDetailsBindingSource.DataMember = OrderDetails;

我綁定每個需要更改跟蹤的實體,就像我綁定 SalesOrder 和 SalesOrderDetails 一樣。 我一直在讀到不建議將實體綁定到 UI,我應該使用視圖模型並將它們綁定到 UI。 但這意味着我必須編寫更改跟蹤代碼或找到一個進行更改跟蹤的庫。

你怎么認為?

如果您的應用程序可以接受綁定到 DataSet 和 DataTable,那么綁定到 EF 模型也是可以的。

一般來說,這取決於您的應用程序的要求; 例如,通常對於小型或以數據為中心的 forms 應用程序,綁定到數據表或實體模型是有意義的,但通常在大型應用程序中,您可能需要考慮更好的關注點分離模式。

如果到 EF 模型的數據綁定對您的應用程序有意義,那么要以正確的方式執行此操作,請遵循此 Microsoft Docs 文章:

關於 IBindingList、IListSource 的一些注意事項

  • 在 Windows Forms 中支持數據綁定到列表所需的接口是IBindingList BindingList<T>是一個很好的實現。
  • IListSource為 object 提供功能以返回可綁定到數據源的列表。 因此,雖然 object 沒有實現IBindingList ,但它可以從其GetList方法返回一個可綁定列表。 它在Windows Forms中得到了很好的支持和使用。例如DataGridView,ComboBox,ListBox,BindingSource檢查數據源是否實現IListSource ,在這種情況下,它們通過調用GetList方法獲取數據源。 這就是為什么 DataTable 在不實現IBindingList的情況下支持數據綁定,而是在 GetList 中返回一個實現了IBindingListDataView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM