用于网格控制的Silverlight并行数据源

我有以下数据模型:

Camp - > CampEvent < - Event。

Camp有与之相关的CampId和Name。 事件有EventId,名称,开始/结束(日期)。 CampEvent有(CampId,EventId)PK,CampId FK,EventId FK。

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

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

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

所以现在问题是我需要检查复选框,当这个控制进入编辑模式。

我注意到Grid没有OnDataBound事件,或者它没有设置每个复选框的状态来检查而不是通过绑定的方式。


那么,显然在Silverlight中,你没有用GridViewRow的内容搞乱它的奢侈。 但是,您可以通过更改基础数据源来实现此目的。

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

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

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

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

  • 如果控制处于创建模式,我就完成了。 Grid的模板列中的复选框双向绑定到基础数据源的IsChecked属性。 第一步就足以创建默认的用户界面,取消选中所有复选框。 否则,请转到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不会在模型中创建连接器表。 然而,要启用Camp和Event之间的导航属性,反之亦然,必须在底层的Domain Service元数据对象上发生一些事情。

    ** 1。 找到阵营元数据信息。 用以下方法装饰IEnumerble<Event>Events属性:

    [Include]
    [Association("CampEvent", "CampId", "EventId", IsForeignKey=True)]
    

    并解释它们的含义:Include包含每当你查询域模型时,请包括指定阵营的每个事件。 该协会表示,营地与活动之间有一个关联表,供导航财产使用。 在查找表中,Camp具有CampId标识符,而Event具有EventId。 使用这些查找指定阵营**的所有事件。

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

    链接地址: http://www.djcxy.com/p/22789.html

    上一篇: Silverlight Concurrent Data Sources for a Grid's Control

    下一篇: Correct way to do DataBinding in a WP7 UserControl