我在我的多线程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 回答
我会采取你的建议1.它是最简单的方法,我没有看到任何违反MVVM模式 .
如果这不适合您 - 您必须将视图相关逻辑放在viewmodel中 . 所以也许有必要让viewmodel监听模型的变化并重新抛出(与视图相关的逻辑)这些对视图的更改 .
当与线程一起工作时要注意调度员的东西,但我想你知道
如果您的线程创建了ShallowModel,则需要引发与viewmodel上的相关的所有属性 . 您可以引发
String.Empty
以告诉数据绑定引擎获取所有绑定属性 . 但是因为你处于一个线程中,你不能解雇PropertyChangedEvent
你需要调度它,所以UI线程可以处理它 . 我们所做的是使用dispatcher使我们的Raise方法ui线程安全 .