用OOA方法分析MVVM

OOA方法分析之前,假设我们对MVVM从来都不了解,但是我们需要一种技术,解决UI编程让界面编程与数据编程进行分离,这样开发界面的人员专心界面技术的研究,数据编程的人员专心业务逻辑的实现。这也就是对MVVM的需求。

一、什么是MVVM

根据数据和界面分离的技术需求,我们可以得到图(1)的用例。在用例中有对数据操

图(1

作和对界面操作的两个角色。数据流向是,当操作数据的角色对数据进行增删改时,立刻在界面上有所反映;当界面操作人员在界面上做修改时,数据操作方也能被告知。有了这些信息我们就可以把整个用例当作一个对象(对象是某事物属性和行为的集合)来描述。MVVM的属性是数据和界面,行为是对数据的操作和对界面的操作。然而,我们知道界面是对数据的一种表现方式,数据是原子的,界面与数据是一种一对多的关系,可以在MVVM中增加一个描述界面数据关系的属性。现在我们来对MVVM三个属性进行概念抽象,就是数据模型、界面视图和视图模型,用英文表示modelviewview-model,他的缩写就是MVVM。用例细化得到了图(2)的结构。

(2)

二、MVVM的实现

接下来我们对ModelViewView-Model进行分析,这三个对象结构还是比较简单的,Model的属性就是我们要定义的数据项,行为变更的通知动作;View的属性是界面元素,行为也一个变更的通知动作;View-Model属性是Model对象,行为根据功能实现确定。有兴趣的自己可以画画用例。MVVM的实现流程是创建ModelViewView-Model三个对象模型,然后实现他们的调用关系。很抽象的一句话,不懂没关系,读懂下面的例子就可以了,但OOA分析就到此结束了。多说一句,OOA的核心思想就是分析边界,属性也好,行为也好都与边界有关。

MVVM就是为WPF而生的,下面以WPFUI开发为例,对WinFromjava什么的就留给各位看客研究,但记住MVVMC/S的,B/S可是MVC。下面以对人的姓名和年龄UI编程为例。ModelViewView-Model的定义是很简单的,看代码就明白,代码中颜色部分下面有解释。

1Model的定义代码:

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),没有它就无法实现双工。

2View-Model的定义代码:

class PersonViewModel

   {

        public PersonModel Person { get; set; }

        public PersonViewModel()

        {

             Person = new PersonModel {FirstName = "John", Age = 999 };

        }

}

这部分没什么可解释的吧!

3View的定义代码,是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的文件。这两个对象的关系,呵呵!值得我们考虑考虑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值