【问题标题】:WPF Binding not being updatedWPF 绑定未更新
【发布时间】: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 多线程不是一个选项 - 这是一个要求:)

标签: c# wpf binding


【解决方案1】:

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

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

把它放在后台线程中。

【讨论】:

  • -1。这根本不能回答我的问题。我知道DoHeavyWork 阻止了我的工作流程。我所追求的是为什么MessageBox 强制 UI 刷新?
  • 没有关于不使用线程的技术争论 - 唯一的问题是我的要求。我不能按要求使用多线程 - 这不是一个足够清楚的理由吗?
  • @GETah 这是什么要求?这是考试还是什么?
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 2015-12-27
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2013-06-01
    • 2014-04-28
    • 2012-06-18
    相关资源
    最近更新 更多