dlr*_*as2 7 data-binding ado.net entity-framework winforms
我正在开发一个内部软件跟踪程序,每个程序修订版都会从Employee数据库中分配一个主程序员.到目前为止我的简单模型看起来像这样:

最初我有一个RevisionBindingSource绑定到我的Revisions集合的对象:
Dim container as new EntityContainer
revisionBindingSource.DataSource = container.Revisions
...
dgRevisions.DataSource = revisionBindingSource
dgRevisions.DataMemeber = ""
Run Code Online (Sandbox Code Playgroud)
这很好用,我能够绑定到我需要的各种属性,例如应用程序标题:
lblAppTitle.DataBindings.Add("Text",revisionBindingSource,"Application.Title")
Run Code Online (Sandbox Code Playgroud)
但是,我现在需要一个ComboBox,其项目绑定到员工列表,并且其选定的值绑定到当前修订的主程序员.我尝试制作一个新的employeeBindingSource,但意识到我没有绑定成员Value:
employeeBindingSource.DataSource = container.Employees
...
cboLead.DataSource = employeeBindingSource
cboLead.DisplayMember = "Name.Display" 'Name is a complex type'
cboLead.ValueMember = '??
Run Code Online (Sandbox Code Playgroud)
所以我重写了一些我的绑定只有一个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")
Run Code Online (Sandbox Code Playgroud)
这仍然没有任何东西填充ComboBox.
哪种模式对我来说更好用 - 两个不同的绑定源,或者一个?在绑定我的ComboBox时我做错了什么?一旦我的ComboBox填充,我如何将当前值绑定到修订版的主程序员?
抱歉这个冗长的问题,谢谢.
表单上有多个绑定源并没有什么问题。事实上,像您上面建议的那样“链接”绑定源可能是一种方便的策略。
但是,在这种情况下,您需要填写一个缺失的链接来支持将属性绑定.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;
}
}
Run Code Online (Sandbox Code Playgroud)
创建此类后,您应该编译并为 EmployeeBindingObject 创建数据源(数据 -> 添加新数据源...)。
ValueMember为EmployeeDisplayMember为EmployeeNameSelectedValue属性设置为其他 BindingSource 的Employee属性。然后,在代码中,您需要初始化绑定对象 BindingSource,如下所示:
employeeBindingObjectBindingSource.DataSource =
EmployeeBindingObject.GetBindingList(container.Employees)
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |