C# 用于网格控件的Silverlight并发数据源

C# 用于网格控件的Silverlight并发数据源,c#,silverlight,silverlight-4.0,wcf-ria-services,C#,Silverlight,Silverlight 4.0,Wcf Ria Services,我有以下数据模型: Camp->CampEvent显然,在Silverlight中,你没有在GridViewRow中摆弄内容的奢侈。但是,您可以通过更改基础数据源来实现这一点 在上面的场景中,我们有一个控件,用于创建Camp实例并将其与一个或多个事件关联。在某种意义上,控件可以创建或更新Camp对象及其与事件的关系。控制状态由枚举公共枚举模式{Create,Update}控制;根据此属性的值,控件将执行以下一个或两个绑定操作: 获取所有事件数据并将其显示在由具有复选框和标签的行组成的网格中。 选

我有以下数据模型:


Camp->CampEvent显然,在Silverlight中,你没有在GridViewRow中摆弄内容的奢侈。但是,您可以通过更改基础数据源来实现这一点

在上面的场景中,我们有一个控件,用于创建Camp实例并将其与一个或多个事件关联。在某种意义上,控件可以创建或更新Camp对象及其与事件的关系。控制状态由枚举公共枚举模式{Create,Update}控制;根据此属性的值,控件将执行以下一个或两个绑定操作:

获取所有事件数据并将其显示在由具有复选框和标签的行组成的网格中。 选中表示特定营地参与的活动的框。 理论上这一切都很好,但原则上我意识到Silverlight需要一个离散的数据源来绑定。我创建了一个CampEvent自定义对象的集合,其中每个元素都有一个布尔属性以及事件名称和事件Id。CampEvent对象不是域实体对象,仅用于绑定

为了实现我的目标,我采取了以下步骤

声明ObservableCollection,其中T仅用于绑定。在本例中,T的底层数据源是我们的事件,使用Linq to Entity查询获取事件的Id和名称,并将其转换为CampEvent对象,其IsChecked属性默认设置为false

如果控件处于创建模式,则完成。网格模板列中的复选框双向绑定到基础数据源的IsChecked属性。第一步足以创建默认UI,且所有复选框均未选中。否则转到3

2号错误,因此控件处于更新模式。如果设置了控件的SelectedCamp属性,并且该属性的类型为Camp。此时,我们创建一个Linq to Entities查询,要求域服务包含与指定营地关联的事件

一旦查询的响应到达,我们将迭代与camp关联的每个事件对象。对于接收到的每个事件,我们检查它是否存在于我们的ObservableCollection数据源中。如果是,我们将该项的IsChecked属性设置为true。一旦我们将数据绑定到网格,所有与特定营地相关的事件都将被检查

任务完成了

关于数据库结构、实体框架生成的域模型和WCF RIA的几句话

嗯,事实证明,EF可能会让你开箱80%。该工具不够智能,无法了解多对多关系是什么。对于营地和活动,我们有以下结构:

camp -> participates in many -> events
(many) events -> have many -> camps (as participants)
因此,为了实现这一点,我们需要在营地和活动之间建立一个连接表。要正确执行此操作,joiner表理论上至少应有两列:

CampId->外键 EventId->外键

现在要为表创建主键,我们应该:

CampId+EventId->复合主键

使我们的表只有两个字段。这一点非常重要,因为这种关系创建了EF中可能的导航属性

生成域模型时,EF不会在模型中创建joiner表。但是,要启用Camp和Event之间的导航属性,或者反之亦然,必须在底层域服务元数据对象上执行一些操作

**一,。找到营地元数据信息。使用以下内容装饰IEnumerbleEvents属性:

[Include]
[Association("CampEvent", "CampId", "EventId", IsForeignKey=True)]
为了解释它们的含义:Include表示,无论何时查询域模型,请包含指定营地的每个事件。协会表示,营地和活动之间有一个关联表,导航属性可以工作。在查找表中,camp具有CampId标识符,Event具有EventId。使用这些来查找指定营地的所有事件**

二,。对您拥有的任何其他导航属性执行相同的操作