我发现最好在每个抽象层中都有一个代表一个项目的对象。这包括存在于磁盘上的数据形式。请记住,在 MVVM 中,唯一真正的目标是促进接口 (User Interface) 和实现 (ViewModel functionality) 之间的松散耦合。
例如,如果我将对象存储在 XML 文件中,我的数据访问层中将有一个对象,该对象仅用于正确管理 XML 数据。我们称之为ObjectXml。此对象仅包含磁盘上数据的本机形式的数据。在这种情况下,所有数据都有一个字符串表示,就像在 XML 文件中一样。
在模型层中,您将以预期的数据类型获得 XML 文件的数据表示。我们称之为Object。属性 getter 和 setter 可以通过在两个方向上执行转换来访问和设置数据的字符串表示。这样,数据就可以持久化到数据源(xml文件、数据库等)了。
在ObjectViewModel 中,属性可以访问Object 中的属性。 viewmodel 包含所有用于表示和修改模型的成员。
请注意,ObjectXml 仅在您仅被允许存储字符串信息或不存在适合您的数据类型的架构时才真正有用。
最后,您有一个包含层次结构,如下所示:
public class ObjectXml
{
[XmlArray("People"), XmlArrayItem("Person")]
public List<PersonXml> People { get; set; }
//PersonXml is an xml data model similar to this one
[XmlElement("Item")]
public string Items { get; set; }
}
这是 Xml 对象的模型:
public class Object
{
private ObjectXml _xmlContext;
public Object(ObjectXml xmlContext)
{
this._xmlContext = xmlContext;
}
public List<Person> People
{
get
{
//Person requires a constructor that takes a PersonXml object in order for this to work properly
return this._xmlContext.People.Select(x => new Person(x)).ToList();
}
set
{
this._xmlContext.People = value.Select(x => new PersonXml(x)).ToList();
}
}
public double Item
{
get { return double.Parse(this._xmlContext.Item); }
set { this._xmlContext.Item = value.ToString(); }
}
}
显然,将类命名为 Object 是不明智的,因为它是 C# 中的保留字。希望我已经为您提供了一些关于如何以稳健且可扩展的方式访问和更新数据的想法。
简而言之,您根本不需要更新方法。此外,缺少常量和属性支持字段,在 C# MVVM 中需要直接字段访问的理由很少。
- 见下文。不要听人说
ViewModel和Model需要解耦。该模型的主要目的是一个中间层,用于准备要保存或加载到程序中的数据,并以与数据和程序功能无关的方式存储数据(ViewModel)
- 您不需要更新方法。如果需要,请使用访问数据模型并持久保存到数据存储 (
xml, database etc.) 的属性。
- 您不需要更新方法。
- 您不必在
ViewModel.cs 内执行任何操作。只有修改视图的代码才应该在代码隐藏中。您应该在视图中访问的唯一ViewModel 是遵循MainWindowViewModel 形式的MainWindowViewModel,它更像是承载其他所需视图模型实例的ApplicationViewModel。
最后,不要使用过于复杂的MVVM "framework",因为大多数功能没有用或没有必要。