相信.NET程序员多多少少都听说过MVVM的设计模式,对于一个大一点的项目来说,使用这种设计模式无疑是一种不错的选择, 它提高了程序的可维护性,降低了耦合度,可以实现代码的重用,方便独立开发和进行测试。这里,笔者讲述一下如何在WindowsPhone中开发使用这种设计模式。

功能描述:通过在前台显示和更改数据来保证后台数据可以实时更新,始终与前台保持一致。

首先,我们建立一个空的WindowsPhone工程,分别为当前工程中添加一个ViewModel文件夹和Model文件夹,用于储存不同的类文件,这样方便进行管理和编写,如图一所示:

图一

其次,我们需要在Model文件夹中创建一个Person类,用于在后台存储数据,示例代码如下所示:

  1. namespace MVVMDemo.Model
  2. {
  3. /// <summary>
  4. /// 该类继承INotifyPropertyChanged,用于对属性值放生改变时的通知
  5. /// 需要自定义实现一个对应的通知函数:FirePropertyChanged
  6. /// </summary>
  7. public class Person:INotifyPropertyChanged
  8. {
  9. private string _name;
  10.  
  11. public string Name
  12. {
  13. get { return _name; }
  14. set {
  15. if (value != _name)
  16. {
  17. _name = value;
  18. FirePropertyChanged();
  19. }
  20. }
  21. }
  22.  
  23. private int _age;
  24.  
  25. public int Age
  26. {
  27. get { return _age; }
  28. set {
  29. if (value != _age)
  30. {
  31. _age = value;
  32. FirePropertyChanged();
  33. }
  34. }
  35. }
  36.  
  37. public Person(string name, int age)
  38. {
  39. this.Name = name;
  40. this.Age = age;
  41. }
  42.  
  43. public event PropertyChangedEventHandler PropertyChanged;
  44.  
  45. public void FirePropertyChanged([CallerMemberName]string propertyName=null)
  46. {
  47. if (PropertyChanged != null)
  48. {
  49. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  50. }
  51. }
  52. }
  53. }

再其次,我们需要在ViewModel中实现一个用于获取Model中数据的类,示例代码如下所示:

  1. namespace MVVMDemo.ViewModel
  2. {
  3. public class GetInfo
  4. {
  5. public Person person ;
  6.  
  7. public GetInfo(string name="Demo", int age=)
  8. {
  9. person = new Person(name, age);
  10. }
  11.  
  12. public Person GetPerson()
  13. {
  14. return person;
  15. }
  16.  
  17. public void SetPerson(string name, int age)
  18. {
  19. person.Name = name;
  20. person.Age = age;
  21. }
  22. }
  23. }

最后,我们需要在View中进行相关数据的展示,笔者这里使用到了数据绑定,如果您对这一部分不是很了解的话,可以查看博客园中一些大牛的博文进行了解,我这里就直接使用了,XAML和CS对应的示例代码如下所示:

  1. <StackPanel>
  2. <GridView Header="设置值:" FontSize="20">
  3. <StackPanel>
  4. <StackPanel Orientation="Horizontal">
  5. <TextBlock Text="Name:" VerticalAlignment="Center"/>
  6. <TextBox x:Name="tb_Name" Text="{Binding Name}" Width="200"/>
  7. </StackPanel>
  8. <StackPanel Orientation="Horizontal">
  9. <TextBlock Text="Age" VerticalAlignment="Center"/>
  10. <TextBox x:Name="tb_Age" Text="{Binding Age}" Width="200" Margin="12"/>
  11. </StackPanel>
  12. <Button Content="修改当前值" Click="ButtonBase_OnClick"/>
  13.  
  14. <StackPanel Orientation="Horizontal">
  15. <TextBlock Text="Name:" VerticalAlignment="Center" FontSize="20"/>
  16. <TextBlock Text="{Binding Name}" Width="200" FontSize="20"/>
  17. </StackPanel>
  18. <StackPanel Orientation="Horizontal" >
  19. <TextBlock Text="Age" VerticalAlignment="Center" FontSize="20"/>
  20. <TextBlock Text="{Binding Age}" Width="200" Margin="12" FontSize="20"/>
  21. </StackPanel>
  22. </StackPanel>
  23. </GridView>
  24. </StackPanel>
  1. namespace MVVMDemo
  2. {
  3. /// <summary>
  4. /// 可用于自身或导航至 Frame 内部的空白页。
  5. /// </summary>
  6. public sealed partial class MainPage : Page
  7. {
  8. private GetInfo info;
  9.  
  10. public MainPage()
  11. {
  12. this.InitializeComponent();
  13.  
  14. this.NavigationCacheMode = NavigationCacheMode.Required;
  15. }
  16.  
  17. /// <summary>
  18. /// 在此页将要在 Frame 中显示时进行调用。
  19. /// </summary>
  20. /// <param name="e">描述如何访问此页的事件数据。
  21. /// 此参数通常用于配置页。</param>
  22. protected override void OnNavigatedTo(NavigationEventArgs e)
  23. {
  24. // TODO: 准备此处显示的页面。
  25.  
  26. if (e.NavigationMode == NavigationMode.New)
  27. {
  28. info = new GetInfo();
  29. this.DataContext = info.GetPerson();
  30. }
  31.  
  32. // TODO: 如果您的应用程序包含多个页面,请确保
  33. // 通过注册以下事件来处理硬件“后退”按钮:
  34. // Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
  35. // 如果使用由某些模板提供的 NavigationHelper,
  36. // 则系统会为您处理该事件。
  37. }
  38.  
  39. private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  40. {
  41. info.SetPerson(tb_Name.Text, Convert.ToInt32(tb_Age.Text));
  42. this.DataContext = info.GetPerson();
  43. }
  44. }
  45. }

最后,程序运行的效果如图二图三所示(它们操作的都是同一个对象):

图二:原始数据                                          图三:修改后的数据

可能你认为MVVM在使用中有点麻烦,但请用发展的眼看来看待它,如果你期待你的项目能够长期进行运作和扩展,那笔者还是很建议你使用这种开发方式的,因为随着你项目的逐渐扩大,你会发现管理起来确实很方便的。顺便附带一个Demo,给初学者一个参考!

如果你感觉这篇博文对你有用,请记得点赞哦!!!!!!!!!!!

在WindowsPhone开发中使用MVVM设计模式的更多相关文章

  1. Android开发中常见的设计模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  3. [HMLY]14.对iOS开发中使用MVVM的理解和使用(初级)

    前言 MVVMDemo 之前几个月一直在学习react-native,它的组件化开发真的是很棒,控件和页面的组件化在开发中可以很好的复用,节省开发时间.在那个时候还不知道react-native开发用 ...

  4. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

  5. iOS 开发中常见的设计模式

    最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...

  6. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

  7. ios项目总结一:开发中常用的设计模式

    一.单例设计模式 1.应用场景: 程序运行期间,在内存中只有一个实例存在,主要用于资源共享,对硬件的访问等等 2.优点: 跨模块,解耦合,使用简单 3.敏捷原则: 单一职责原则 4.SDK实例: UI ...

  8. iOS开发中的MVC设计模式

    我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是 ...

  9. Android开发中常见的设计模式(一)——单例模式

    首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中. 保持 ...

随机推荐

  1. 循环结构-for,while,do-while

    for,while,do-while >完整的循环应该包含以下四个部分: 初始化语句:初始化工作,在循环体开始之前执行 条件表达式:一个boolean表达式,决定是否执行循环体 循环体:反复执行 ...

  2. day13_雷神_前端01

    #前端 html 服务器端返回的就是一个字符串,浏览器根据html规则去渲染这个字符串. html 是超文本标记语言,相当于定义统一的一套规则,大家都遵守它,这样就可以让浏览器根据标记语言的规则去解释 ...

  3. PB9.0连接sqlserver2008 R2

    pb9不支持sql2000以上版本的数据库直连.因此要连接2000以上的版本必须用odbc. windows下的odbc管理器打开方式:窗体键+R 调出运行对话框 输入 odbcad32 确定弹出od ...

  4. 设置UniDbGrid的整行显示颜色,如果某字段值是我们的控制字段

    设置UniDbGrid的整行显示颜色,如果某字段值是我们的控制字段,使用下列判断设置更快捷一点: procedure TUniForm.UniDBGridDrawColumnCell(Sender: ...

  5. Android-Java-构造函数间调用&this内存图

    构造函数间调用: 描述Person对象: package android.java.oop08; // 描述Person对象 public class Person { public String n ...

  6. Android开发 - 掌握ConstraintLayout(五)偏差(Bias)

    比如实现这样一个场景: "在屏幕宽度的1/4的地方放置一个View" 使用传统布局时,实现按照屏幕的宽度(高度),或者相对两个View之间距离的一个比例来进行布局,就显得非常麻烦, ...

  7. Java学习笔记39(转换流)

    转换流:字符流和字节流之间的桥梁 用于处理程序的编码问题 OutputStreamWriter类:字符转字节流 写文本文件: package demo; import java.io.FileOutp ...

  8. Appium同时连接多台手机进行测试(多线程)

    作为测试小白,当时遇到了N多问题: 开启多线程后,发现app启动后,用例就停止了:且启动app对应的手机不能正确对应,用例中是A手机跑A用例,结果启动了B手机跑A用例报错. 主要原因:Appium S ...

  9. 初识The ONE

    Author:bakari  Date:2014.1.14 转载请注出处:http://www.cnblogs.com/bakari/p/3519841.html,谢谢! 本学期开始做真正意义上的研究 ...

  10. Mac-让 Finder 显示隐藏文件和文件夹

    打开「终端」,输入以下内容,然后「Return」键,这样就把隐藏的文件和文件夹显示了: defaults write com.apple.finder AppleShowAllFiles -boole ...