C# 未更新WPF绑定

C# 未更新WPF绑定,c#,wpf,binding,C#,Wpf,Binding,在我的视图模型上,我具有以下属性: public Visibility IsModelBusy { get; set; } 我有一个很长的处理任务,可以: private void DoSomething(object obj) { IsModelBusy = Visibility.Visible; OnPropertyChanged("IsModelBusy"); DoHeavyWork(); IsModelBusy = Visibility.Collaps

在我的视图模型上,我具有以下属性:

public Visibility IsModelBusy { get; set; }
我有一个很长的处理任务,可以:

private void DoSomething(object obj)
{
    IsModelBusy = Visibility.Visible;
    OnPropertyChanged("IsModelBusy"); 
    DoHeavyWork();
    IsModelBusy = Visibility.Collapsed;
    OnPropertyChanged("IsModelBusy");
}
我有一个绑定到IsModelBusy的UI元素:

问题 当繁重的任务正在进行时,我的边框始终不可见,主窗口挂起。我无法在后台线程中运行此操作 我尝试在传递给调度程序的操作中包装属性更改调用,但没有成功,问题仍然存在

现在如果我这样做:

private void DoSomething(object obj)
{
    IsModelBusy = Visibility.Visible;
    OnPropertyChanged("IsModelBusy"); 
    MessageBox.Show("What the...");  <=========
    DoHeavyWork();
    IsModelBusy = Visibility.Collapsed;
    OnPropertyChanged("IsModelBusy");
}
随着MessageBox的引入,UI似乎能够处理属性更改事件并正确更新

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

您正在用DoHeavyWork阻塞UI线程

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


把它放在一个背景线程中。

在反复研究之后,我终于找到了问题的答案:

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

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

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


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

您是否尝试过将绑定模式设置为双向?我相信可见性是默认的一种方式。>我不能在后台线程中运行它-你能解释一下,为什么吗?谁在调用DoSomething?@Bob双向绑定到可见性没有任何意义。@Dennis多线程不是一个选项-这是一个要求:-1。这根本不能回答我的问题。我知道DoHeavyWork阻塞了我的工作流程。我想问的是为什么MessageBox会强制UI刷新?没有关于不使用线程的技术争论-唯一的问题是我的需求。我不能按要求使用多线程-这不是一个足够清楚的理由吗?@GETah这是什么样的要求?这是考试还是什么?
private void DoSomething(object obj)
{
    IsModelBusy = Visibility.Visible;
    OnPropertyChanged("IsModelBusy"); 
    MessageBox.Show("What the...");  <=========
    DoHeavyWork();
    IsModelBusy = Visibility.Collapsed;
    OnPropertyChanged("IsModelBusy");
}