绑定到由在后台工作的线程创建的对象的属性
本文关键字:线程 创建 对象 属性 工作 后台 绑定 | 更新日期: 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没有被更新。我的问题是:
我应该将Model公共属性添加到ViewModel并像{Binding Path=Model.DbState}那样绑定视图吗?我认为这破坏了MVVM的想法——View不应该知道Model。
ShallowModel中的InObject是在用户单击UI上的按钮后由一个新线程创建的。因此,当创建ViewModel时,InObject为null。不知何故,在线程创建ActObjectState之后,它没有更新。如何使其发挥作用?使绑定类似于{binding Path=Model.InObject.ActState}?这意味着UI设计者需要了解Model。
Thx,sry用于我的英语
我接受你的建议1。这是最简单的方法,我看不出有任何违反MVVM模式的行为。
如果这对您不起作用,您必须将视图相关的逻辑放入您的视图模型中。因此,viewmodel可能有必要监听模型的更改,并(使用与视图相关的逻辑)将这些更改重新抛出到视图中。
当使用线程时,请注意调度器的内容,但我认为您知道
如果您的线程创建了ShallowModel,则需要引发与视图模型相关的所有属性。您可以引发一个String.Empty
来告诉数据绑定引擎获取所有绑定的属性。但是因为你在一个线程中,你不能只触发PropertyChangedEvent
,你需要调度它,这样UI线程就可以处理它。