【问题标题】:How to ensure all properties have loaded in Silverlight ViewModel pattern (Concurrency Control?)如何确保所有属性都已加载到 Silverlight ViewModel 模式(并发控制?)
【发布时间】:2011-05-24 02:51:43
【问题描述】:

我正在与一个看似很小但相当痛苦的困境作斗争。我有一个对象,它充当控件的视图模型。

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

Group -> GroupEvent <- Event

视图模型有两个可观察的集合——一个用于事件,一个用于组。 events 集合代表任何组可用的所有事件。所有事件仅从 WCF RIA 服务加载一次,到达后,每个事件的实体数据都被复制到本地对象中,该对象被推送到事件集合中。

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

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

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

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

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

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

谢谢,

Bleepzter

【问题讨论】:

  • 您没有在这里回答您自己的问题吗?您说在事件加载完成后加载组。也许显示一些代码?
  • @Phil Sandler - 是的,在代码中操作是按顺序定义的,但是数据的到达不依赖于该顺序。一个人可以先于另一个人到达,反之亦然,这是我担心的原因。

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


【解决方案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 中。这是某人编写的一个 Result,它为 DataContext 添加了一个扩展方法。

【讨论】:

    最近更新 更多