【问题标题】:How can I bind an Entity Framework association to a ComboBox?如何将实体框架关联绑定到 ComboBox?
【发布时间】:2011-08-09 19:14:34
【问题描述】:

我正在开发一个内部软件跟踪程序,每个程序修订版都从员工数据库中分配了一个首席程序员。到目前为止,我的简单模型如下所示:

最初我有一个RevisionBindingSource 对象,它绑定到我的Revisions 集合:

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

这很好,我能够绑定到我需要的各种属性,例如应用程序标题:

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

但是,我现在需要一个 ComboBox,其项目绑定到员工列表,并且其选定值绑定到当前版本的首席程序员。我尝试创建一个新的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。

哪种模式更适合我使用 - 两个不同的绑定源,还是一个?我在绑定我的 ComboBox 时做错了什么?一旦我的 ComboBox 被填充,我如何将当前值绑定到修订版的首席程序员?

抱歉这个冗长的问题,谢谢。

【问题讨论】:

  • +1 为您的问题提供了很好的展示
  • 您使用的是什么 UI 框架。赢表格?添加标签以获得更好的答案。
  • 一些付费控件可以做到这一点(我正在使用 DevExpress,它允许这样做)。您可能会考虑编写一个自定义组合框,该组合框从常规组合框扩展而来并返回您需要的内容。
  • 你忘了做这样的事情吗 - cboLead.DataBind()?

标签: winforms entity-framework data-binding ado.net


【解决方案1】:

在表单上拥有多个绑定源并没有错。事实上,像您上面建议的那样“链接”绑定源可能是一种方便的策略。

但是,在这种情况下,您需要填写一个缺失的链接以支持将.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. ValueMember 设置为Employee
  2. DisplayMember 设置为EmployeeName
  3. SelectedValue 属性设置为其他 BindingSource 的 Employee 属性。
  4. 然后,在您的代码中,您需要按如下方式初始化绑定对象 BindingSource:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多