C# 来自ViewModel的多个绑定更新

C# 来自ViewModel的多个绑定更新,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个MVVM模型 看法 当应用程序运行时,“更新数据库”后只显示“更新数据库”,而不显示“更新数据库”。 似乎只有在方法UpdateProcess运行后视图才会更新 我需要在属性更改后立即更新视图。这可能吗 即使我一步一步地调试代码,当UI通过第一个OnPropertyChanged时,它也不会更新。整个UpdateProcess()完成后,UI将更改为“Database updated”。内部值更改后,您可以展开Status属性的setter以提升property changed priv

我有一个MVVM模型

看法

当应用程序运行时,“更新数据库”后只显示“更新数据库”,而不显示“更新数据库”。 似乎只有在方法UpdateProcess运行后视图才会更新

我需要在属性更改后立即更新视图。这可能吗


即使我一步一步地调试代码,当UI通过第一个OnPropertyChanged时,它也不会更新。整个UpdateProcess()完成后,UI将更改为“Database updated”。

内部值更改后,您可以展开Status属性的setter以提升property changed

private string _status;
public string Status
{
  get
  {
    return _status;
  }
  set
  {
    _status = value;
    OnPropertyChanged("Status");
  }
}
接下来会发生的是,在设置Status属性时,PropertyChanged将触发并通知UI更新字段

这是WPF知道从绑定更新控件值的唯一方法,而不是在创建控件之后

另一件可能有影响的事情是绑定的模式

<StatusBar>
  <StatusBarItem>
    <TextBlock Text="{Binding Status, UpdateSourceTrigger=PropertyChanged}, Mode=TwoWay" Width="Auto"/>
  </StatusBarItem>
</StatusBar>


您可以查看模式的更好描述,我认为问题在于您试图在长时间运行的操作期间显示状态消息,但它们没有显示。这很可能是因为您的长时间运行的操作正在上执行(因此阻塞)UI线程。当UI线程被阻止时,UI上的任何内容都不会更新;事实上,如果你被阻止的时间足够长,Windows会向用户建议你的应用程序已停止响应,应该关闭

如果您使用的是带有async/await的C#版本,则可以执行以下操作:

    private async Task UpdateProcess()
    {
        UpdateStatus("Updating Database");
        await Task.Run(UpdateDatabaseMethod);
        UpdateStatus("Database updated");
    }

    private void UpdateDatabaseMethod()
    {
        //Do long-running stuff in background...
        //Note that this will no longer be executing in the UI thread
        //so you may need to watch out for thread safety issues that you could previously ignore
        //This might mean adding some locks around your database access methods...
    }
对于异步/等待支持之前的版本,请签出

需要注意的是,您现在正在后台线程中运行长时间运行的任务,这与阻塞UI时的行为不同。这可能会带来许多新的挑战和头痛,但不幸的是,如果您希望与长时间运行的任务并行运行UI,这是一个必要的缺点


其他问题包括,用户现在可以在更新数据库时单击其他内容。如果需要阻止UI交互,则需要其他机制来禁用可能会在长时间运行的操作过程中发生干扰的控件。解决此问题的一种典型方法是使用stat进行某种“忙碌指示器”对话框我们的消息是这样的。

如果没有真正的代码示例,很难知道您在这里实际需要什么。如果您在一行中用两条这样的消息逐字更新
Status
属性,即使您在更新之间强制用户界面更新,用户也不会注意到。现在计算机太快了。您的实际情况是什么l场景?你想解决什么具体问题?你希望Message1闪烁一秒钟吗?例如,你需要实现一个计时器。否则,我觉得它像预期的那样工作。你期望发生什么?使线程休眠。它仍然没有像我期望的那样工作@user2588666@Shorn,睡觉将锁定UI线程,这意味着将永远不会呈现更新;UI将在5秒钟内无响应。如果您想在后台运行某些内容时更新UI,则需要使用某种异步处理机制,并将状态更新发送到UI线程。
<StatusBar>
  <StatusBarItem>
    <TextBlock Text="{Binding Status, UpdateSourceTrigger=PropertyChanged}, Mode=TwoWay" Width="Auto"/>
  </StatusBarItem>
</StatusBar>
    private async Task UpdateProcess()
    {
        UpdateStatus("Updating Database");
        await Task.Run(UpdateDatabaseMethod);
        UpdateStatus("Database updated");
    }

    private void UpdateDatabaseMethod()
    {
        //Do long-running stuff in background...
        //Note that this will no longer be executing in the UI thread
        //so you may need to watch out for thread safety issues that you could previously ignore
        //This might mean adding some locks around your database access methods...
    }