【问题标题】:How to get an OnPropertyChanged event to exectue before the current event continues [duplicate]如何在当前事件继续之前执行 OnPropertyChanged 事件[重复]
【发布时间】:2017-03-03 07:13:40
【问题描述】:
private void Build_Button(object sender, RoutedEventArgs e)
    {
        T.BuildStatus = "Building...";            
        BuildSelected(T.ListofTrucks);                  
        T.BuildStatus = "Build Complete";
    }

目前我有一个绑定到 T.BuildStatus 的标签,我想在编译文件时显示“Building...”,但标签只会在 buildSelected 方法完成后更新。在继续事件调用的其余部分之前,如何更新此标签?

编辑:对象 T 正在正确实现 INotifyPropertyChanged

【问题讨论】:

  • 第 1 步:使用 MVVM,忘记您的 WinForms 背景。
  • @HristoYankov 我没有看到任何迹象表明他们没有...
  • 我正在使用 MVVM,我认为更新 BuildStatus 的事件被延迟到按钮事件完成。
  • BuildSelected(T.ListofTrucks); 看起来好像在您的 UI 线程上调用它,阻止任何和所有 UI 更新。如果它的 CPU 绑定使用Task.Run 将其从 UI 线程中踢出,或者如果它的 IO 绑定将其设置为async
  • @JSteward 你能解释一下如何做到这一点吗?我还没有在 wpf 中完成线程。

标签: c# wpf


【解决方案1】:

假设BuildSelected(T.ListofTrucks); 是CPU 密集型工作。如果在 UI 线程上调用它,它将阻止 INotify 更新,即由于 UI 线程很忙,它无法更新。最简单的解决方法:

private async void Build_Button(object sender, RoutedEventArgs e)
{
    T.BuildStatus = "Building...";            
    await Task.Run(() => BuildSelected(T.ListofTrucks));                  
    T.BuildStatus = "Build Complete";
}

或者如果是 IO 操作:

private async void Build_Button(object sender, RoutedEventArgs e)
{
    T.BuildStatus = "Building...";            
    await BuildSelectedAsync(T.ListofTrucks));                  
    T.BuildStatus = "Build Complete";
}

async Task BuildSelectedAsync(ListofTrucks x) 的实现将根据 IO 操作和您的具体操作而有所不同。

【讨论】:

  • 谢谢你,效果很好!
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2020-07-14
  • 2012-05-29
  • 2023-01-08
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多