绑定到由在后台工作的线程创建的对象的属性

本文关键字:线程 创建 对象 属性 工作 后台 绑定 | 更新日期: 2023-09-27 18:24:55

我在多线程WPF应用程序中使用MVVM模式。

现在,在我的模型中(我跳过了INotifyPropertyChanged接口的明显实现,以使其更加清晰):

public class ShallowModel : INotifyPropertyChanged
{
  private string _dbState;
  public string DbState
  {
     get { return _dbState; }
     set 
     { 
       _dbState = value;
       OnPropertyChanged("DbState") // ofc there is implementation of this
     }
  }
  private InsideObject _inObject;
  public InsideObject InObject
  {
     get { return _inObject; }
     set 
     { 
       _inObject = value;
       OnPropertyChanged("InObject") 
     }
  }
}   
public class InsideModel : INotifyPropertyChanged
{
  private string _actState;
  public string ActState
  {
     get { return _actState; }
     set 
     { 
       _actState= value;
       OnPropertyChanged("ActState")
     }
  }
}

假设我在视图中有文本块:

<TextBlock Text={Binding ActObjectState}/>
<TextBlock Text={Binding DbState}/>

现在有一部分ViewModel有问题:

public class ViewModel : INotifyPropertyChanged
{
  private ShallowModel _model;
  public string ActObjectState
  {
     get 
     { 
       if(_model.InObject != null)
         return _model.InObject.ActState; 
       else
         return null;
     }
  }
  public string DbState
  {
     get 
     { 
       return _model.DbState;
     }
  }
}

问题是当后台线程更新ShallowModel和/或InsideModel的属性时,ActObjectState和DbState没有被更新。我的问题是:

  1. 我应该将Model公共属性添加到ViewModel并像{Binding Path=Model.DbState}那样绑定视图吗?我认为这破坏了MVVM的想法——View不应该知道Model。

  2. ShallowModel中的InObject是在用户单击UI上的按钮后由一个新线程创建的。因此,当创建ViewModel时,InObject为null。不知何故,在线程创建ActObjectState之后,它没有更新。如何使其发挥作用?使绑定类似于{binding Path=Model.InObject.ActState}?这意味着UI设计者需要了解Model。

Thx,sry用于我的英语

绑定到由在后台工作的线程创建的对象的属性

我接受你的建议1。这是最简单的方法,我看不出有任何违反MVVM模式的行为。

如果这对您不起作用,您必须将视图相关的逻辑放入您的视图模型中。因此,viewmodel可能有必要监听模型的更改,并(使用与视图相关的逻辑)将这些更改重新抛出到视图中。

当使用线程时,请注意调度器的内容,但我认为您知道

如果您的线程创建了ShallowModel,则需要引发与视图模型相关的所有属性。您可以引发一个String.Empty来告诉数据绑定引擎获取所有绑定的属性。但是因为你在一个线程中,你不能只触发PropertyChangedEvent,你需要调度它,这样UI线程就可以处理它。