wp8使用mvvm模式简单例子
mvvm是silverlight/wpf下的mvc升华
通过一个简单的加法计算器例子来说明mvvm是什么
在设计界面完成设计之后,显示简单的布局,如下图:
然后来比较,传统的直接方式,mvc和mvvm三种的区别
1.最直接的方式无非就是双击Button按钮,在OnClick事件中获得两个TextBox的值,进行相加然后赋值给TextBlock
这样使得xaml.cs文件中直接操作了界面元素
2.mvc模式
首先定义一个AddModel类,并继承DependencyObject
public class AddModel:DependencyObject
{ public int Number1
{
get { return (int)GetValue(Number1Property); }
set { SetValue(Number1Property, value); }
} // Using a DependencyProperty as the backing store for Number1. This enables animation, styling, binding, etc...
public static readonly DependencyProperty Number1Property =
DependencyProperty.Register("Number1", typeof(int), typeof(AddModel),null); public int Number2
{
get { return (int)GetValue(Number2Property); }
set { SetValue(Number2Property, value); }
} // Using a DependencyProperty as the backing store for Number2. This enables animation, styling, binding, etc...
public static readonly DependencyProperty Number2Property =
DependencyProperty.Register("Number2", typeof(int), typeof(AddModel), null); public int Result
{
get { return (int)GetValue(ResultProperty); }
set { SetValue(ResultProperty, value); }
} // Using a DependencyProperty as the backing store for Result. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ResultProperty =
DependencyProperty.Register("Result", typeof(int), typeof(AddModel), null); }
继承了DependencyObject之后定义属性快捷方式如下:
定义好三个属性之后
在前台xaml文件引入命名空间
xmlns:my="clr-namespace:PhoneApp1"
并在Resources中声明
<phone:PhoneApplicationPage.Resources>
<my:AddModel x:Key="addModel"></my:AddModel>
</phone:PhoneApplicationPage.Resources>
将上面的几个控件的父容器,Grid的DataContext设置为addModel
并将各个控件的Text属性绑定对应的值,模式为双向绑定
<Grid x:Name="ContentPanel" Grid.Row="1" DataContext="{StaticResource addModel}">
<TextBox x:Name="txtNumber1" Text="{Binding Number1,Mode=TwoWay}" VerticalAlignment="Top" Width="129"/>
<TextBox x:Name="txtNumber2" Text="{Binding Number2,Mode=TwoWay}" VerticalAlignment="Top" Width="129"/>
<TextBlock Text="+" VerticalAlignment="Top" RenderTransformOrigin="2.571,0.593"/>
<Button Content="=" Click="Button_Click"/>
<TextBlock x:Name="txtResult" Text="{Binding Result,Mode=TwoWay}" />
</Grid>
为了方便看清楚各个控件Text的绑定情况遂删除了一些属性
在xaml.cs后台中,使用Button的OnClick事件
private void Button_Click(object sender, RoutedEventArgs e)
{
AddModel addModel = (AddModel) Resources["addModel"];
addModel.Result = addModel.Number1 + addModel.Number2;
}
获取到Resources中的addModel
并计算Result
启动运行
这样一来,在后台的xaml.cs中就没有操作界面元素了
但是还是要根据Button的OnClick事件才能实现
而在本例中mvvm模式的终极目标就是要消除OnClick!
3.mvvm模式
预备知识
Button有一个Command和CommandParameter属性
当Button的OnClick事件被触发时
Command属性对应的 继承了ICommand接口的类的Execute方法将会被执行,方法的参数是CommandParameter属性(Object类型)
于是需要一个新的类,叫做AddCommand,继承了ICommand接口
public class AddCommand:ICommand
{
public bool CanExecute(object parameter)
{
return true;
} public void Execute(object parameter)
{
throw new NotImplementedException();
} public event EventHandler CanExecuteChanged;
}
并在AddModel中新增一个只读属性AddCmd
public ICommand AddCmd {
get { return new AddCommand();}
}
返回xaml前台
在Button的属性中增加Command和CommandParameter属性的绑定
<Button Command="{Binding AddCmd}" CommandParameter="{Binding}" Content="=" HorizontalAlignment="Left" Margin="380,28,0,0" VerticalAlignment="Top"/>
(注意将OnClick事件清除)
启动运行
完成计算
这是后台中没有任何对前台界面元素的操作
mvvm完成
最后,思路有点乱
mvvm是靠一个继承了ICommand接口的类来实现的
当Button的OnClick事件被触发之后
Command属性对应的对象(这里为AddModel的AddCmd属性,该属性是只读的,返回一个AddCommand对象)的Execute方法会被执行
CommandParameter属性对应的值会被当做参数传入Execute方法(这里CommandParameter的值为AddModel本身)
在Execute方法中实现计算的操作
由于界面的控件数据源是双向绑定的
addModel的值一改变
界面就会显示出对应的值
那么这么做的好处是什么?
可以从代码中看到
前台的UI控件只要设置了数据源,并绑定了相应的属性就不需要进行任何操作了
在后台没有任务的业务逻辑处理的代码
所有的业务代码都在AddCommand的Execute方法中完成
而AddModel为UI控件的数据绑定提供了模型
wp8使用mvvm模式简单例子的更多相关文章
- wp8使用mvvm模式简单例子(二)---登陆功能,事件触发
首先,还是需要一个Model类来为UI层的元素提供数据源 public class LoginModel:DependencyObject { public string Uid { get { re ...
- MVC模式和MVVM模式简单理解
相信这是两个耳熟能详的词了,MVC广泛的用到了java的各种框架当中,比如Struts2, SpringMVC等,作为B/S架构开发,MVS模式也是我们必须掌握的. mvc一步一步演化之后有了现在的M ...
- WPF WebBrowser+TabControl MVVM模式 简单应用 提供源码下载
源代码下载 这个程序是TabControl和Webbrowser的练手小程序 可达到练手目的有: MVVM设计模式的基本使用 Binding(包括相对源[RelativeSource]绑定)的基本使用 ...
- MVVM开发模式简单实例MVVM Demo
本文主要是翻译Rachel Lim的一篇有关MVVM模式介绍的博文 A Simple MVVM Example 并具体给出了一个简单的Demo(原文是以WPF开发的,对于我自己添加或修改的一部分会用红 ...
- WPF中使用MVVM模式进行简单的数据绑定
计划慢慢整理自己在WPF学习和工作应用中的一些心得和想法,先从一个简单的用法说起 在WPF中,XAML标记语言中绑定数据,而数据源就是指定为ViewModel类,而非界面本身的逻辑代码类 这样一定程度 ...
- 【转】ASP.NET MVC框架下使用MVVM模式-KnockOutJS+JQ模板例子
KnockOutJS学习系列----(一) 好几个月没去写博客了,最近也是因为项目紧张,不过这个不是借口,J. 很多时候可能是因为事情一多,然后没法静下来心来去写点东西,学点东西. 也很抱歉,突然看到 ...
- Android开发模式之MVC,MVP和MVVM的简单介绍与区别
相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候 ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
随机推荐
- linux系统初始化——文件系统初始化步骤
linux文件系统初始化步骤 System V init启动过程 概括地讲,Linux/Unix系统一般有两种不同的初始化启动方式. 1) BSD system init 2) System V in ...
- [1]区分event对象中的[clientX,offsetX,screenX,pageX]
前言 在平时的开发中,非常讨厌的就是兼容性了,兼容性的问题总会让我们记忆混淆,所以这次来区分一下event对象中的常用获取鼠标位置. clientX clientY event.clientXeven ...
- classes could not be found: - android.support.v7.internal.app.WindowDecorActionBar问题的解决方法
转载至----http://my.oschina.net/u/2425146/blog/546649?fromerr=aDYrFDVx.仅作个人收藏使用,有转载的朋友请连续原作者,谢谢 刚刚进入stu ...
- kvm虚拟机最佳实践系列2-创建KVM及KVM优化
创建KVM及KVM优化 把KVM优化与KVM创建放在一起,是因为我们创建的KVM是要用在生产环境中,所以基础优化工作是必备的. 创建KVM 创建系统盘, 大小: 操作系统通常都不到10G,所以系统盘2 ...
- shell中各种美元符号组合
$ 这个程式的执行名字 $n 这个程式的第n个参数值,n=.. $* 这个程式的所有参数,此选项参数可超过9个. $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前进程ID号) $! 执 ...
- Mysql数据库乱码总结
今天又独到了Mysql乱码问题,过去总是匆匆的解决了就算了.这次我实在受不了了.每次都是迷迷糊糊的改好的. 这次决定好好探索一把,看了很多资料及博客之后才理解了点.先记录下来.如有不对的请指正. 1. ...
- [BZOJ2442][Usaco2011 Open]修剪草坪 dp+单调队列优化
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1118 Solved: 569[Submit] ...
- (分享别人的一篇好文章,来自jackson0714)30分钟全面解析-SQL事务+隔离级别+阻塞+死锁()
30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQ ...
- (3)C#工具箱-容器
容器特点:把控件放到容器里,移动容器控件也会跟着移动. 1.flowLayoutPanel(流布局控件) 放入控件后,会自动垂直或水平排列 拉长布局,控件自动跑到一行 2.GroupBox(组合框) ...
- Binary Tree Maximum Path Sum - LeetCode
Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...