在运行时使用mvvm更新模型
本文关键字:更新 模型 mvvm 运行时 | 更新日期: 2023-09-27 18:02:25
熟悉MVVM,熟悉模型、视图模型和视图之间的区别。我唯一无法找到答案的是如何在运行时更新模型。一个简单的例子来告诉你我的意思:
假设我有一个可以显示图形并将其存储在数据库中的应用程序。
我有模型
public class Session {
public Document Doc { get; set; }
}
public class Document {
public string Name { get; set; }
public Point[] GraphPoints { get; set; }
}
我可以把它们作为参数传递给它们的视图模型,所以:
public class SessionViewModel{
private readonly Session _session;
public SessionViewModel(Session session)
{
this._session = session;
}
}
public class DocumentViewModel{
private readonly Document_document;
public SessionViewModel(Document document)
{
this._document = document;
}
}
public class ShellViewModel {
public SessionViewModel SessionVm { get; set; } // <-- Bind in view
public DocumentViewModel DocumentVm { get; set; } // <-- Bind in view
private Session _session;
public ShellViewModel()
{
_session = new Session();
session.Doc = new Document();
SessionVm = new SessionViewModel(session);
DocumentVm = new DocumentViewModel(session.Doc);
}
}
问题出现在我的应用程序的生命周期的中间,我决定改变document
的值。例如:
public void OnNewDocumentLoaded(Document newDoc)
{
_session.Doc = newDoc;
}
_session.Doc
被改变了,但每个DocumentViewModel
都有自己的document
实例,这是在构造函数中传递的,所以即使我改变了模型,我的视图模型保持不变。
我也不想在我的模型中使用INotifyPropertyChanged
,因为模型不应该知道框架,从我的理解这是一个糟糕的方法。此外,我保持我的模型在PCL项目,所以我甚至不能在我的模型中实现INotifyPropertyChanged
。
从我对MVVM方法的理解来看,模型不应该有与它们相关联的视图模型。相反,您的视图应该有一个与之关联的视图模型。在视图模型中,您可以拥有来自应用程序中模型的对象。在你的视图模型中,你应该实现INotifyPropertyChanged
。这些方法控制你所改变的对象,然后绑定可以发生在你的视图和视图模型之间。