我发现在每个抽象层都有一个代表项的对象是最好的做法。这包括数据形式在磁盘上的存在方式。请记住,在MVVM中,唯一真正的目标是促进界面(用户界面)和实现(ViewModel功能)之间的松散耦合。
例如,如果我有存储在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; }
[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
{
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(); }
}
}
显然,在C#中将您的类命名为Object是不明智的,因为它是保留字。希望我已经给您提供了一些关于如何以强大和可扩展的方式访问和更新数据的想法。
简而言之,您根本不需要更新方法。此外,在C# MVVM中除了常量和属性后备字段之外,几乎没有理由需要直接访问字段。
请看下方内容。不要听那些说需要将ViewModel和Model解耦的人。Model的主要作用是作为中介层,准备数据以便保存或加载到程序中,并以一种对数据和程序功能(ViewModel)都不了解的方式存储数据。
您不需要更新方法。使用访问数据模型并在需要时将其持久化到数据存储(xml、数据库等)的属性即可。
您不需要更新方法。
您不应该在ViewModel.cs中执行任何操作。只有修改视图的代码应该在代码后台中。您在视图中唯一应该访问的ViewModel是遵循MainWindowViewModel形式的ViewModel,它更像是一个ApplicationViewModel,携带其他所需的viewmodels实例。
最后,不要陷入使用过于复杂的MVVM“框架”中,因为大部分功能都是不必要的。
ClassB
(视图模型)实现INotifyPropertyChanged
接口,并将ClassB
设置为MainWindow的DataContext
(可以从代码后台或xaml中进行设置)。然后,您需要将UI元素绑定到视图模型字段并填充这些字段。您可以找到许多简单的MVVM模式实现示例。 - Yuri Dorokhov