c# - WPF MVVMLight Messenger UI 线程问题

标签 c# wpf multithreading mvvm mvvm-light

我有一个关于在 WPF (MVVM) 应用程序中使用 MVVMLight messenger 的问题。在 View 中,我有一个元素( LoadingControl ),其可见性属性通过使用自定义可见性转换器绑定(bind)到 viewmodel 属性( IsBusy )。在 View 模型中,我通过发送 MVVM 消息来更改属性值( IsBusy ):

Messenger.Default.Send(new LoadingMessage(true));

在这里,我有一个 View 模型中的方法,它被重新注册以接受 正在加载消息 消息,其中 属性变了。

这工作正常,但是在我发送此消息的 View 模型方法之一中,UI 线程 block 和 属性值更改,但我的 UI 元素的可见性 加载控制 直到主要操作未完成,例如:
void Call() {
    Messenger.Default.Send(new LoadingMessage(true));

    SomeServiceCall();
    Navigate(); // <- this works with UI, too
} // <- this is the place when LoadingControl is shown.

我想问题是因为在 View 模型中执行不在 ui 线程上,所以我尝试直接在 中调用它调用() 方法:
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
    IsBusy = true;
});

但这也行不通,加载控制 直到方法结束才显示。由于我对多线程不太熟悉,我想这里还有其他问题。任何帮助表示赞赏。

最佳答案

Messenger 在您的线程中发送消息,因此您需要等待。我认为您需要在另一个线程中发送消息。

DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
    Messenger.Default.Send(new LoadingMessage(true));
});

关于c# - WPF MVVMLight Messenger UI 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28541794/

相关文章:

c# - 我可以为对象动态创建属性类型和属性名称吗?

c# - 以编程方式获取页面的屏幕截图

c# - Oracle .Net 托管数据访问错误 : Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly

c# - Selenium、等待元素、页面对象模型、c# 绑定(bind)

c# - 在 Eyeshot 11 中选择 Solid3D 实体的边和顶点

wpf - 担心 WPF。我应该为 Windows GUI 使用 WPF 还是其他库?

c# - 从 ComboBox 的模板设置 ComboBoxItem 的样式

java - 使 DateFormat 线程安全。使用什么,同步或线程本地

multithreading - 在线程中使用特征方法

c++ - 当第二个线程从 map 中删除值时如何恢复线程?