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

时间:2011-05-24 02:51:43

标签: c# silverlight mvvm lazy-loading wcf-ria-services

我正在努力应对看似微不足道但又相当痛苦的困境。我有一个对象作为控件的视图模型。

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

Group -> GroupEvent <- Event

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

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

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

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

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

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

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

谢谢,

Bleepzter

1 个答案:

答案 0 :(得分:1)

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

IResult示例,文档为here

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

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