首页 文章

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

提问于
浏览
1

我在我的多线程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")
     }
  }
}

假设我在视图上有TextBlocks:

<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没有被更新 . 我的问题是:

  • 我应该将模型公共属性添加到ViewModel并绑定视图,如?我认为它破坏了MVVM的想法 - View不应该知道Model .

  • ShallowModel中的InObject是在UI上的用户单击按钮之后由新线程创建的 . 因此,在创建ViewModel时,InObject为null . 不知何故 - 在线程创建之后 - ActObjectState没有更新 . 如何使其工作?像那样进行绑定?这意味着需要通过UI设计师了解Model .

谢谢,sry我的英语

2 回答

  • 0

    我会采取你的建议1.它是最简单的方法,我没有看到任何违反MVVM模式 .

    如果这不适合您 - 您必须将视图相关逻辑放在viewmodel中 . 所以也许有必要让viewmodel监听模型的变化并重新抛出(与视图相关的逻辑)这些对视图的更改 .

    当与线程一起工作时要注意调度员的东西,但我想你知道

  • 0

    如果您的线程创建了ShallowModel,则需要引发与viewmodel上的相关的所有属性 . 您可以引发 String.Empty 以告诉数据绑定引擎获取所有绑定属性 . 但是因为你处于一个线程中,你不能解雇 PropertyChangedEvent 你需要调度它,所以UI线程可以处理它 . 我们所做的是使用dispatcher使我们的Raise方法ui线程安全 .

相关问题