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

时间:2011-05-10 20:20:40

标签: c# silverlight silverlight-4.0 wcf-ria-services

我有以下数据模型:

阵营 - > CampEvent< - Event。

Camp有CampId和名称相关联。 事件有EventId,Name,Start / End(Dates)。 CampEvent有(CampId,EventId)PK,CampId FK,EventId FK。

这些表用于创建在Silverlight上从客户端使用的域模型和域服务。

我成功地使用网格在Silverlight中显示事件表。

Grid有两个模板列 - 一个用于显示复选框,另一个用于显示事件的名称。

所以现在问题是我需要在此控件进入编辑模式时检查复选框。

我注意到网格没有OnDataBound事件,或者它没有办法将每个复选框的状态设置为检查而不是通过绑定。

1 个答案:

答案 0 :(得分:0)

嗯,显然在Silverlight中你没有浪费掉GridViewRow的内容。但是,您可以通过更改基础数据源来实现此目的。

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

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

    为了实现我的目标,这些是我采取的步骤。

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

    2. 如果控件处于创建模式,我就完成了。 Grid的模板列中的复选框与底层数据源的IsChecked属性双向绑定。第一步就足以创建默认UI,并取消选中所有复选框。否则请转到3

    3. 嗯,数字2错了,因此控件处于“更新”模式。如果设置了控件的SelectedCamp属性(并且此属性的类型为Camp)。此时,我们创建了一个Linq to Entitities查询,我们要求域服务包含与指定阵营关联的事件。

    4. 一旦来自查询的响应到来,我们就会遍历与该阵营关联的每个Event对象。对于收到的每个事件,我们检查它是否存在于我们的ObservableCollection数据源中。如果是,我们将该项的IsChecked属性设置为true。一旦我们数据绑定网格,所有与特定阵营相关联的事件将被“检查”。

    5. 任务完成。

    6. 关于数据库结构,实体框架生成的域模型和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。对于您拥有的任何其他导航属性,请执行相同的操作。