我有以下数据模型:
阵营 - > CampEvent< - Event。
Camp有CampId和名称相关联。 事件有EventId,Name,Start / End(Dates)。 CampEvent有(CampId,EventId)PK,CampId FK,EventId FK。
这些表用于创建在Silverlight上从客户端使用的域模型和域服务。
我成功地使用网格在Silverlight中显示事件表。
Grid有两个模板列 - 一个用于显示复选框,另一个用于显示事件的名称。
所以现在问题是我需要在此控件进入编辑模式时检查复选框。
我注意到网格没有OnDataBound事件,或者它没有办法将每个复选框的状态设置为检查而不是通过绑定。
答案 0 :(得分:0)
嗯,显然在Silverlight中你没有浪费掉GridViewRow的内容。但是,您可以通过更改基础数据源来实现此目的。
在上面的场景中,我们有一个控件,用于创建Camp的实例并将其与一个或多个事件相关联。在某种意义上,控件可以创建或更新“Camp”对象及其与Events的关系。控件状态由枚举public enum Mode { Create, Update };
控制,并且根据此属性具有的值,控件将执行以下一个或两个绑定绑定操作:
理论上这一切都很好用,但原则上我意识到Silverlight需要一个离散的数据源来绑定。我创建了一个CampEvent自定义对象的集合,其中每个元素都有一个布尔属性IsChecked,以及事件名称和事件ID。 CampEvent对象不是Domain Entity对象,仅用于绑定。
为了实现我的目标,这些是我采取的步骤。
声明ObservableCollection,其中T仅用于绑定。在这种情况下,T的底层数据源是我们的Event,Linq to Entity查询用于获取事件的Id和名称,并将其转换为CampEvent对象,默认情况下其IsChecked属性设置为false。 p>
如果控件处于创建模式,我就完成了。 Grid的模板列中的复选框与底层数据源的IsChecked属性双向绑定。第一步就足以创建默认UI,并取消选中所有复选框。否则请转到3
嗯,数字2错了,因此控件处于“更新”模式。如果设置了控件的SelectedCamp属性(并且此属性的类型为Camp)。此时,我们创建了一个Linq to Entitities查询,我们要求域服务包含与指定阵营关联的事件。
一旦来自查询的响应到来,我们就会遍历与该阵营关联的每个Event对象。对于收到的每个事件,我们检查它是否存在于我们的ObservableCollection数据源中。如果是,我们将该项的IsChecked属性设置为true。一旦我们数据绑定网格,所有与特定阵营相关联的事件将被“检查”。
任务完成。
关于数据库结构,实体框架生成的域模型和WCF RIA的几句话。
好吧,事实证明EF可以让你开箱即用80%。该工具不够智能,无法知道多对多关系是什么。在营地和活动的情况下,我们有以下结构:
camp -> participates in many -> events
(many) events -> have many -> camps (as participants)
为了实现这一目标,我们需要营地和活动之间的“木匠”表。为了做到这一点,理论上,连接表应该至少有两列:
CampId - >外键 EventId - >外键
现在要为Table创建一个主键,我们应该:
CampId + EventId - >复合主键。
让我们的桌子只有2个字段。现在这非常重要,因为这种关系可以在EF中创建导航属性。
生成域模型时,EF不会在模型中创建joiner表。但是要在Camp和Event之间启用导航属性,反之亦然,有几件事情有发生在底层域服务元数据对象上。
** 1。找到Camp元数据信息。使用:
装饰IEnumerble<Event>Events
属性
[Include]
[Association("CampEvent", "CampId", "EventId", IsForeignKey=True)]
并解释这些含义:Include说,无论何时查询域模型,请包含指定阵营的每个事件。该协会表示,营地和活动之间有一个关联表,用于导航属性的工作。在查找表中,camp具有CampId标识符,Event具有EventId。使用这些来查找指定阵营的所有事件**。
<强> 2。对于您拥有的任何其他导航属性,请执行相同的操作。