2011-08-09 117 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)