2011-08-09 155 views
6

我正在開發一個內部軟件跟蹤程序,並且每個程序修訂版都分配有一個來自Employee數據庫的鉛程序員。我簡單的模型看起來像這樣至今:如何將實體框架關聯綁定到組合框?

Entity Framework model

起初,我不得不將其綁定到我的Revisions集合RevisionBindingSource對象:

Dim container as new EntityContainer 
revisionBindingSource.DataSource = container.Revisions 
... 
dgRevisions.DataSource = revisionBindingSource 
dgRevisions.DataMemeber = "" 

這個工作好,我是能夠綁定到我需要的各種屬性,例如應用標題:

lblAppTitle.DataBindings.Add("Text",revisionBindingSource,"Application.Title") 

但是,我現在需要一個Co mboBox的項目被綁定到員工列表,並且其選定的值綁定到當前版本的主程序員。我試圖使一個新的employeeBindingSource,但意識到,我沒有結合部爲Value

employeeBindingSource.DataSource = container.Employees 
... 
cboLead.DataSource = employeeBindingSource 
cboLead.DisplayMember = "Name.Display" 'Name is a complex type' 
cboLead.ValueMember = '?? 

所以我改寫了我的一些綁定到只有一個bindingSource

bindingSource.DataSource = container 
... 
dgRevisions.DataSource = bindingSource 
dgRevisions.DataMemeber = "Revisions" 
... 
cboLead.DataSource = bindingSource 
cboLead.DisplayMember = "Employees.Name.Display" 
cboLead.ValueMember = "Employees" 
... 
lblAppTitle.DataBindings.Add("Text",bindingSource,"Revisions.Application.Title") 

這還不甚至用任何東西填充組合框。

哪種模式更適合我使用 - 兩種不同的綁定源,或一種?我在綁定我的ComboBox時做了什麼錯誤?而且一旦我的組合框填充,我怎樣才能將當前值綁定到修訂版的主要程序員?

對不起,這個冗長的問題,謝謝。

+0

+1您的問題 –

+1

什麼UI框架的漂亮的演示您使用。的WinForms?添加標籤以獲得更好的答案。 –

+0

一些付費控件可以做到這一點(我正在使用DevExpress並且允許這樣做)。您可能會考慮編寫一個自定義的組合框,它可以從常規的組合框中擴展並返回您所需要的組合框。 –

回答

3

在窗體上擁有多個綁定源沒有任何問題。事實上,像上面所說的「鏈接」綁定來源可能是一種方便的策略。

但是,在這種情況下,您將需要填寫缺少的鏈接以支持將.Value屬性綁定到實際EF對象:您需要爲綁定目的創建單獨的類。此技術在綁定枚舉時也非常有用。

當您的EF數據模型不完全匹配您希望您的UI工作的方式時,此技術非常常見。對於WPF(不像本例中的WinForms),這通常被稱爲ViewModel的一部分。這樣做幾次後,它將成爲第二天性。

下面是類的一個示例實現,你將需要創建:

public class EmployeeBindingObject 
{ 
    public Employee Employee { get; private set; } 
    public string EmployeeName 
    { 
     get { return this.Employee.Name; } 
    } 

    private EmployeeBindingObject(Employee employee) 
    { 
     this.Employee = employee; 
    } 

    /// <summary> 
    /// Gets a binding list for a specified list of Employees. 
    /// </summary> 
    /// <param name="types"></param> 
    /// <returns></returns> 
    public static IBindingList GetBindingList(IEnumerable<Employee> employees) 
    { 
     BindingList<EmployeeBindingObject> result = new BindingList<EmployeeBindingObject>(); 

     foreach (var ee in employees) 
     { 
      result.Add(new EmployeeBindingObject(ee)); 
     } 

     return result; 
    } 
} 

一旦你創建這個類,你應該編譯,然後創建一個數據源(數據 - >添加新數據源.. )爲EmployeeBindingObject。

  1. 設置的ValueMemberEmployee
  2. DisplayMemberEmployeeName
  3. SelectedValue財產到其他的BindingSource的Employee財產。
  4. 然後,在你的代碼,你需要如下初始化綁定對象的BindingSource:

    employeeBindingObjectBindingSource.DataSource = 
        EmployeeBindingObject.GetBindingList(container.Employees)