我正在尝试基于MySQL数据库支持的实体框架6 DbContext
来实现基本的Master-Detail视图。表配置非常简单:
我的测试应用程序的形式包含两个ComboBox
元素 - 一个用于主类别,一个用于子类别(在我的情况下,master是电子组件的类型,例如" IC&#34 ;细节更具体,如" FPGA","微控制器"等。)
每个DataSource
的{{1}}属性都通过表单设计器设置为自己的ComboBox
。
绑定源本身以不同的方式设置BindingSource
属性,遵循我发现的各种教程:
DataSource
DbSet
表的comp_main_type
BindingList
属性设置为"导航属性"从大师到细节DataMember
在某种程度上,这可以按预期工作 - 正确填充了主ExampleEntities entities = new ExampleEntities();
entities.comp_main_type.Load();
entities.comp_sub_type.Load();
BindingSourceCompMainType.DataSource = entities.comp_main_type.Local.ToBindingList();
BindingSourceCompSubType.DataSource = BindingSourceCompMainType;
BindingSourceCompSubType.DataMember = "comp_sub_type";
,但未详细填充ComboBox
。 ComboBox
的类型名称不是显示单个项目,而是显示为唯一项目:
HashSet
调试器显示此System.Collections.Generic.HashSet`1[ExampleApp.comp_sub_type]
确实包含由所选主项目筛选的正确项目:
我无法找到导致这种情况的原因 - 为什么详细信息HashSet
不会填充ComboBox
的项目,而是HashSet
本身?< / p>
答案 0 :(得分:1)
在检查提供的链接 Reza Aghaei 之后,问题的原因变得非常明显:不知何故,我跳过了指南的一个重要部分。
添加以下课程是必要的:
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Data.Entity;
namespace WinFormswithEFSample
{
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());
}
}
}
之后,必须修改代码生成模板:
找到将嵌套在ProductModel.edmx文件下的ProductModel.tt文件
双击ProductModel.tt文件,在Visual Studio编辑器中打开它
使用“ObservableListSource”查找并替换两次出现的“ICollection”。它们位于大约296和484行。
使用“ObservableListSource”查找并替换第一次出现的“HashSet”。此事件位于大约第50行。请勿替换代码中稍后发现的第二次出现的HashSet。
保存ProductModel.tt文件。这应该导致实体的代码被重新生成。如果代码未自动重新生成,请右键单击ProductModel.tt并选择“运行自定义工具”。
来源:https://msdn.microsoft.com/en-us/library/jj682076(v=vs.113).aspx
应用这些更改后,详细信息视图将按预期工作。