-1

在我的 View 模型上,我有以下属性:

public Visibility IsModelBusy { get; set; }

我有一个很长的处理任务:

private void DoSomething(object obj)
{
    IsModelBusy = Visibility.Visible;
    OnPropertyChanged("IsModelBusy"); 
    DoHeavyWork();
    IsModelBusy = Visibility.Collapsed;
    OnPropertyChanged("IsModelBusy");
}

我有一个绑定到的 UI 元素IsModelBusy

<Border Visibility="{Binding IsModelBusy, UpdateSourceTrigger=PropertyChanged}">
...
</Border>

问题 我的边框永远不可见,并且在繁重的任务正在进行时主窗口挂起(我无法在后台线程中运行它)我尝试将属性更改调用包装在传递给调度程序的操作中,但没有运气,问题仍然存在持续存在。

现在,如果我这样做:

private void DoSomething(object obj)
{
    IsModelBusy = Visibility.Visible;
    OnPropertyChanged("IsModelBusy"); 
    MessageBox.Show("What the...");  <=========
    DoHeavyWork();
    IsModelBusy = Visibility.Collapsed;
    OnPropertyChanged("IsModelBusy");
}

随着 的引入MessageBox,UI 似乎可以处理属性更改事件并正确更新。

问题 在不使用后台任务的情况下,如何强制 UI 处理PropertyChanged事件?

4

2 回答 2

5

您正在使用DoHeavyWork().

Dispatcher 无法处理任何其他操作(例如刷新 UI),因为它正忙于执行您的代码。

把它放在后台线程中。

于 2013-09-18T17:32:16.850 回答
0

在玩了很多之后,我终于找到了我的问题的答案:

随着 MessageBox 的引入,UI 似乎可以处理属性更改事件并正确更新。

消息框强制应用程序处理其消息队列,从而处理属性更改事件并更新 UI。

在不使用后台任务的情况下,如何强制 UI 处理 PropertyChanged 事件?

没有办法解决这个问题 - 我保留了消息框解决方案来强制 UI 处理所有事件

于 2013-09-21T08:16:33.377 回答