WPF绑定未更新

时间:2013-09-18 17:26:40

标签: c# wpf binding

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

public Visibility IsModelBusy { get; set; }

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

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

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

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

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

现在,如果我这样做:

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

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

问题 如果不使用后台任务,我如何强制UI处理PropertyChanged事件?

2 个答案:

答案 0 :(得分:5)

您正在使用DoHeavyWork()阻止UI线程。

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

将它放在后台线程中。

答案 1 :(得分:0)

经过多次讨论后,我终于找到了问题的答案:

  

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

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

  

不使用后台任务,如何强制UI处理PropertyChanged事件?

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