在运行时使用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更新模型

从我对MVVM方法的理解来看,模型不应该有与它们相关联的视图模型。相反,您的视图应该有一个与之关联的视图模型。在视图模型中,您可以拥有来自应用程序中模型的对象。在你的视图模型中,你应该实现INotifyPropertyChanged。这些方法控制你所改变的对象,然后绑定可以发生在你的视图和视图模型之间。

相关文章: