在OOA方法分析之前,假设我们对MVVM从来都不了解,但是我们需要一种技术,解决UI编程让界面编程与数据编程进行分离,这样开发界面的人员专心界面技术的研究,数据编程的人员专心业务逻辑的实现。这也就是对MVVM的需求。
一、什么是MVVM
根据数据和界面分离的技术需求,我们可以得到图(1)的用例。在用例中有对数据操
图(1)
作和对界面操作的两个角色。数据流向是,当操作数据的角色对数据进行增删改时,立刻在界面上有所反映;当界面操作人员在界面上做修改时,数据操作方也能被告知。有了这些信息我们就可以把整个用例当作一个对象(对象是某事物属性和行为的集合)来描述。MVVM的属性是数据和界面,行为是对数据的操作和对界面的操作。然而,我们知道界面是对数据的一种表现方式,数据是原子的,界面与数据是一种一对多的关系,可以在MVVM中增加一个描述界面数据关系的属性。现在我们来对MVVM三个属性进行概念抽象,就是数据模型、界面视图和视图模型,用英文表示model、view和view-model,他的缩写就是MVVM。用例细化得到了图(2)的结构。
图(2)
二、MVVM的实现
接下来我们对Model、View和View-Model进行分析,这三个对象结构还是比较简单的,Model的属性就是我们要定义的数据项,行为变更的通知动作;View的属性是界面元素,行为也一个变更的通知动作;View-Model属性是Model对象,行为根据功能实现确定。有兴趣的自己可以画画用例。MVVM的实现流程是创建Model、View和View-Model三个对象模型,然后实现他们的调用关系。很抽象的一句话,不懂没关系,读懂下面的例子就可以了,但OOA分析就到此结束了。多说一句,OOA的核心思想就是分析边界,属性也好,行为也好都与边界有关。
MVVM就是为WPF而生的,下面以WPF的UI开发为例,对WinFrom、java什么的就留给各位看客研究,但记住MVVM是C/S的,B/S可是MVC。下面以对人的姓名和年龄UI编程为例。Model、View和View-Model的定义是很简单的,看代码就明白,代码中颜色部分下面有解释。
1、Model的定义代码:
class PersonModel : INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
firstName = value;
OnPropertyChanged("FirstName");
}
}
privateint age;
public int Age
{
get { return age; }
set
{
age = value;
OnPropertyChanged("Age");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(stringpropertyName)
{
if (PropertyChanged!= null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
黄色部分的代码就是PersonModel通知行为的实现,只不过利用了.net Framework的通知功能,这段代码是可以被复制使用的,弄清原理需要分析.net Framework,可以告诉你的是,它就是面向驱动编程的实现。单对象模型的定义比较简单吧。数据列表就得实现INotifyCollectionChanged,实现过程还是比较复杂的。只是为了应用的话,推荐你定义列表数据对象时继承ObservableCollection<T>一切都解决了。
这部分代码的目的就是为了实现双工方式(TwoWay),没有它就无法实现双工。
2、View-Model的定义代码:
class PersonViewModel
{
public PersonModel Person { get; set; }
public PersonViewModel()
{
Person = new PersonModel {FirstName = "John", Age = 999 };
}
}
这部分没什么可解释的吧!
3、View的定义代码,是XAML语言:
<StackPanelx:Name="mainStackPanel" Orientation="Vertical"Margin="4">
<StackPanel.DataContext>
<local:PersonViewModel />
</StackPanel.DataContext>
<StackPanelOrientation="Vertical" DataContext="{Binding Path=Person,Mode=TwoWay}" Margin="4">
<StackPanelOrientation="Horizontal">
<Label Content="FirstName:" Margin="0,0,4,0"/>
<TextBoxWidth="250" Name="fName" Text="{BindingPath=FirstName}"/>
</StackPanel>
<StackPanelOrientation="Horizontal" Margin="0,5,0,0">
<LabelContent="Age:" Margin="35,0,4,0"/>
<TextBoxWidth="50" MaxLength="3" Text="{BindingPath=Age}"/>
</StackPanel>
</StackPanel>
</StackPanel>
XAML语言的绑定规则大家还是应该去了解的,黄色部分我为大家提一个概念,这就是IOC控制反转的技术。再给大家一段实现黄色脚本段的用C#实现的代码:
PersonViewModelpersonViewModel = new PersonViewModel();
this.mainStackPanel.DataContext=personViewModel;
希望这段代码能给你带来更多的编程启发。接下来就是你的舞台了。
三、对MVVM使用中的建议
对MVVM分析下来,有两点还是值得说一说的:
1、很明显MVVM把一个简单UI开发问题搞得很复杂,就像MVC一样使用得好给我们带来益处不少,用得不好那就是简单的问题复杂花,再复杂化。但本人还是推荐使用的。呵呵!用它之前多用OOA方法分析分析!
2、在MVVM增加了一个ViewModel模型对象,但我们在生成XAML时就会自动生成一个.cs的文件。这两个对象的关系,呵呵!值得我们考虑考虑!