WPF MVVM-模型由哪些部分组成
首先,我对WPF和MVVM还很陌生。在过去的两个月里,我读了很多关于WPF MVVM-模型由哪些部分组成,wpf,mvvm,model,Wpf,Mvvm,Model,首先,我对WPF和MVVM还很陌生。在过去的两个月里,我读了很多关于视图和视图模型的书,我认为我对这两个方面都有足够的了解。大多数文章很少涉及模型部分,我发现自己很难理解它 目前,我的理解是,模型往往是那些我们在关系数据库的实体关系(ER)模型中知道的实体。有一段时间,我确实会看到像服务这样的术语,但我不确定它们是否是型号 现在,我想问两个问题: 如果我有程序状态,这将影响各种不同的视图的显示方式,这些是否被视为模型?到目前为止,我将把它们放在所谓的服务下,这些服务仅仅是在应用程序生命周期内存在
视图
和视图模型
的书,我认为我对这两个方面都有足够的了解。大多数文章很少涉及模型
部分,我发现自己很难理解它
目前,我的理解是,模型往往是那些我们在关系数据库的实体关系(ER)模型中知道的实体。有一段时间,我确实会看到像服务
这样的术语,但我不确定它们是否是型号
现在,我想问两个问题:
如果我有程序状态,这将影响各种不同的视图的显示方式,这些是否被视为模型
?到目前为止,我将把它们放在所谓的服务
下,这些服务仅仅是在应用程序生命周期内存在的单例。然后,我将通过调用服务的方法,或者通过INotifyPropertyChanged
订阅服务中的更改,使ViewModels
与它们交互。但这样做让我感到困惑,因为他们感觉不像是模型
;事实上,他们觉得自己完全是MVVM之外的东西
我的应用程序不使用数据库。以一种非常奇怪的方式,我需要将持久性信息/数据保存在XML文件中。比如说,如果我有这个Car
model类,我的应用程序需要保存Car
对象的列表。同样,我是否应该拥有那些所谓的服务
,它们将负责序列化和反序列化Car
对象,并将其保存在列表
中?然后同样的问题又来了-是服务
是模型
的一部分吗
编辑
有人告诉我我的问题1不清楚。让我举个例子
例如,程序有一个窗口,在窗口的不同部分有多个视图
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<view:ViewA Grid.Column="0" />
<view:ViewB Grid.Column="1" />
</Grid>
因此,在ViewA
中,有一个具有命令绑定的按钮。因此,当单击按钮时,它将导致某些内容在后台运行(例如,可以是计算任务)。当某个东西运行时,程序进入一种特殊状态。当程序进入该状态时,其中一个控件(例如文本框
)将进入禁用模式(IsEnabled=“False”
),在后台任务完成且程序返回正常状态之前,该模式将暂时不接受任何输入
那么,整个MVVM概念中的这一点在哪里?我知道这可能不再是一个与模型
相关的问题,但当我开始这篇文章时,我认为它很可能适合模型
模型,而不是那些呈现视图或更改视图的模型。模型是数据类。例如,假设您有一个显示汽车详细信息的视图(Car.xaml)。该视图可能有图片、标题、汽车名称、最高速度、里程以及许多共同的功能。
您可以将此视图绑定到视图模型(CarViewModel.cs),在该视图模型中,您可以将视图的属性绑定到列表或独立属性,如string、double和all
如果要将详细信息绑定到列表,则肯定需要为该列表定义一个数据类。为此,您创建了一个数据类。说CarData.cs
public class CarData : BindableBase
{
private string carName;
private double mileage;
public string CarName
{
get {return carName;}
set {SetProperty(ref carName, value);}
}
........
}
等等。。
您可以定义此数据类中的所有属性,并为每个视图重用同一类,甚至在viewmodel中创建汽车列表
更新模型时,视图也将更新,因为会触发NotifyPropertyChanged事件。
为了保存数据,您可以在需要时将其序列化为xml文件,如在单击按钮或关闭应用程序时。
只需将视图模型中的列表序列化为xml文件。
我希望你明白了。如果有任何疑问,请回复。我不太担心汽车视图从车型获取数据和更改通知。我更关心的是,我必须处理不止一辆汽车
。我肯定需要在程序的某个地方保留一个列表
(或者列表
或者列表
)。如果我没有弄错的话,您是在建议我将此列表保留在ViewModel中,并且ViewModel还将处理对XML文件的序列化/反序列化?当然可以。你很容易就能做到。假设创建一个包含从xml文件反序列化的所有项的listview。反序列化时,创建列表并将其作为列表保留在viewmodel中。视图中的listview将绑定到此列表。根据列表的当前选定项,您可以在右侧或左侧的同一视图中显示特定车辆的更多详细信息。您可能需要一个数据类来显示汽车列表,即它只包含汽车名称和一个小描述。另一个包含汽车更多详细信息的列表。您可以保留汽车ID或汽车名称来映射这两个列表。因此,回到我的问题1,如果我有某些程序状态会影响多个视图
,我可以将它们存储在实现INotifyPropertyChanged
的单例
类中,并让感兴趣的ViewModels
视图订阅singleton
对象中的更改通知?那么,如果我这样做,MVVM结构中的singleton
类是什么?ViewModel
?程序状态肯定不是视图模型,因为视图模型对应于每个视图。它可以包含在一个新的文件夹中,比如Common或ViewController之类。甚至我在我的项目中也有很多这样的文件。就像我们为转换器创建一个新文件夹一样,因为转换器不是vi的一部分