【发布时间】:2013-09-18 17:26:40
【问题描述】:
在我的视图模型上,我有以下属性:
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>
问题 当繁重的任务正在进行时,我的边框永远不可见并且主窗口挂起(我无法在后台线程中运行它) 我尝试将属性更改调用包装在传递给调度程序的操作中,但没有成功,问题仍然存在。
现在如果我这样做:
private void DoSomething(object obj)
{
IsModelBusy = Visibility.Visible;
OnPropertyChanged("IsModelBusy");
MessageBox.Show("What the..."); <=========
DoHeavyWork();
IsModelBusy = Visibility.Collapsed;
OnPropertyChanged("IsModelBusy");
}
随着MessageBox 的引入,UI 似乎可以处理属性更改事件并正确更新。
问题
在不使用后台任务的情况下,如何强制 UI 处理 PropertyChanged 事件?
【问题讨论】:
-
您是否尝试将
Binding Mode设置为Two-Way?我相信可见性是默认的One-Way。 -
> 我不能在后台线程中运行它 - 你能解释一下,为什么?
-
谁在调用 DoSomething()?
-
@Bob 双向绑定可见性没有任何意义。
-
@Dennis 多线程不是一个选项 - 这是一个要求:)