gpt4 book ai didi

c# - Caliburn Micro 在构造函数中开始协程 - 破坏 View ?

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:19 25 4
gpt4 key购买 nike

我在 CM 中使用 View 模型优先的方法,我创建了一个 View 模型并在之后立即激活它。在 ViewModel 的构造函数中,我使用以下方法启动协程:

Coroutine.BeginExecute(Example().GetEnumerator());

我的 View 中有一个忙碌指示器,我将忙碌属性(绑定(bind)到忙碌指示器控件上的 IsBusy 属性的 TwoWay)设置为 true。为真时,指示器显示;当为假时,它是隐藏的。

所以我的协程看起来像这样:

IsBusy = true;
var example = client.AsyncOp();
yield return example;
var exampletwo = client.AnotherAsyncOp();
yield return exampletwo;
IsBusy = false;

问题似乎是 IsBusy 没有正确传播到 View 。有时指示器甚至不会显示。还有其他情况(最常见)指示器会显示,但即​​使在 IsBusy 设置为 false 后也不会关闭。

我不认为这是一个繁忙指标问题,因为其他各种属性也会发生这种情况。例如,如果我设置了一个绑定(bind)到 ListBox 的 SelectedItem 的属性,该属性将被设置,但 ListBox 不会在 GUI 中将其显示为它的 SelectedItem。

最初执行协程时,Views 属性的计数为零,然后在第一个yield return 后突然计数为 1。我可能错了,但似乎存在某种竞争条件,CM 正在连接 View ,而我正在设置属性。

我也试过将协程移动到 OnViewLoaded 事件,但仍然有同样的问题,考虑到上一段,这很好奇!

谢谢

最佳答案

This是一个很好的例子,说明如何用 CM 做忙指示器。

然后从你的协程你可以做:

[Import(RequiredCreationPolicy = CreationPolicy.Shared)]
public IBusyWatcher Busy { get; set; }

private IEnumerable<IResult> LoadData()
{
using (Busy.GetTicket())
{
...
}
}

关于c# - Caliburn Micro 在构造函数中开始协程 - 破坏 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com