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

本文关键字:ViewModel Silverlight 模式 并发控制 加载 确保 何确保 属性 | 更新日期: 2023-09-27 17:57:23

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

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

Group -> GroupEvent <- Event

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

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

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

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

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

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

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

谢谢

哔哩

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

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

IRsult示例,文档在这里。

 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");
    }

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