如何确保所有属性都已加载Silverlight ViewModel模式(并发控制?)

我正在努力寻找一个看似很小但相当痛苦的困境。 我有一个对象作为控件的视图模型。

基础视图模型旨在帮助显示所有可用事件之外的组对象及其相关事件的列表 。 在底层数据模型中,我有以下实体(EF)及其对应的关系:

Group -> GroupEvent <- Event

视图模型有两个可观察的集合 – 一个用于事件,一个用于组。 事件集合表示可用于任何组的所有事件。 所有事件仅从WCF RIA服务加载一次,并且在到达时将每个事件的实体数据复制到本地对象中,该对象被推入事件集合中。

除了Event实体的属性之外,LocalEvent对象还定义了一个“IsSelected”布尔属性,默认情况下它被初始化为“false”。 此属性在具有双向绑定的CheckBoxGridColumn中使用,以便我可以将复选框’state设置为选中或取消选中。

ViewModel中的Groups集合以相同的方式初始化。 我创建了一个LocalGroup对象,它有一个LocalGroupEvents集合。 在事件加载后的构造函数中,我从WCF RIA服务加载所有Group实体(及其相关的GroupEvents)。 我将每个Group实体的所有属性复制到LocalGroup对象中,设置其LocalGroupEvents集合,最后将LocalGroup推送到ModelView的Groups可观察集合中。

最后,这两个集合将绑定到各自的网格。 组网格仅显示组名称,而事件网格显示每个事件旁边的复选框。 groups网格有一个SelectedItemChanged事件处理程序,每当它发生时,我抓取LocalGroup对象,我读取它的所有LocalGroupEvents并将Events网格中的“IsSelected”属性设置为true,以用于其Id与LocalGroupEvents中的Eventid匹配的每个事件。

嗯,这个工作流程很好。 100%的时间。 我遇到的问题是,如果事件的数据在组的数据之后到达,该怎么办? 我的意思是,由于任何RIA服务调用都是异步的,因此不会暂停线程以确保数据以正确的顺序到达。

如果只有一个组,并且在事件有机会加载之前加载速度超快,该怎么办? 在该场景中,即使用户点击该组,他们也将看不到任何内容,也无法编辑所选组。

在UI绑定到模型视图之前,如何确保数据以正确的顺序到达?

谢谢,

Bleepzter

您可以使用Caliburn Micro的IResult和Coroutines。 它允许您按特定顺序填充这些异步事物。

IResult示例,docs在这里 。

  public IEnumerable GoForward() { yield return Loader.Show("Downloading..."); yield return new LoadCatalog("Caliburn.Micro.Coroutines.External.xap"); yield return Loader.Hide(); yield return new ShowScreen("ExternalScreen"); } 

你可以从这里获取LoadData.cs。 它位于Samples / GameLibrary / GameLibrary / Framework / Results中。 这是一个人写的结果,它为DataContext添加了一个扩展方法。