手把手玩转win8开发系列课程(7)

在这章中,我将向读者展示metro 程序中最核心的部分——展示数据。为了使用应用程序只是简单的负责显示数据和处理用户交互,我这里使用view model的方式。

对于这种数据业务展示分离的设计模式来说,你可能蛮熟悉的有mvc模式,有mvvm模式。这里,绑定数据的模式,并不是他们。如果你想学习mvc,mvvm设计模式的话,就去百度百科,维基百科吧,这里面有一些很精辟的描述。

就我而言,我认为使用view model优点很多很多,任何metro 工程(除了特别小工程)就值得考虑考虑,因此我强烈的推荐给读者使用这种模式。当然了,我也并不是什么模式控。但我始终认为一定的模式能够在大多数的项目中解决实际的问题。最终,你会发现我如何把这一个观点的看法成功在这一模型上使用。

这章的重点是在metro app中幕后的管道,我可以建立一个这个程序展示不同Metro app的特点。我慢慢地开始,定义了一个简单的模型,并阐述不同的技术,使数据的视图模型应用到显示数据绑定中。你会看到一个项目是如何从分解成多页再合并为同一的整体来展示最终的数据。下图是本节的概要介绍。。

注意,我们这一节的项目是在上一节的项目开展进行的。

添加一个View Model

viewmodel是一个metro app的核心。使用他将呈现用户的界面与数据分离。视图模型是必不可少创建应用程序的基础,其能很提高程序的效率。这个目标是吧包含在独特的ui控件中数据做一个权威的数据,但你会明白这样一点,很快的找出那个无法控制更新的数据。

一开始,我在vs中就创建了一个名叫的data的新的文件夹,而且在这一文件夹下面创建了两个新类的文件、第一个叫食品项(GroceryItem)的类,他代表了食品列表中的单独的一项。源代码如下所示:

1 using System.ComponentModel;
 2 namespace MetroGrocer.Data {
 3   public class GroceryItem : INotifyPropertyChanged {
 4 //名称                          //商店
 5 private string name, store;
 6      //价格
 7     private int quantity;
 8    //名称
 9    public string Name {
10       get { return name; }
11       set { name = value; NotifyPropertyChanged("Name"); }
12     }
13        //价格
14     public int Quantity {
15       get { return quantity; }
16       set { quantity = value; NotifyPropertyChanged("Quantity"); }
17     }
18     public string Store {
19       get { return store; }
20       set { store = value; NotifyPropertyChanged("Store"); }
21     }
22 //实现了INotifyPropertyChanged 接口
23     public event PropertyChangedEventHandler PropertyChanged;
24     private void NotifyPropertyChanged(string propName) {
25       if (PropertyChanged != null) {
26         PropertyChanged(this, new PropertyChangedEventArgs(propName));
27       }
28     }
29   }
30 }

这个类定义了名称和质量的属性是为了模拟你下实际中的下订单的情况。他这些类都是observable,很重要一个方面是用户控件支持这么数据绑定,他意味着当你ui上的数据改变时候,后台的数据也会自动发生了改变。

你应该实现了 System.ComponentModel.INotifyPropertyChanged的接口中的PropertyChangedEventHandler事件,使这个类的数据完成前台后台的同步。

另外在这一命名空间下实现了viewmodel的类,他包含了用户的数据和程序中所运行的状态。相应的源代码如下:

1 using System.Collections.Generic;
 2 using System.Collections.ObjectModel;
 3 using System.ComponentModel;
 4 namespace MetroGrocer.Data {
 5   public class ViewModel : INotifyPropertyChanged {
 6 //GroceryItem 的ObservableCollection的集合
 7     private
 8 ObservableCollection<GroceryItem> groceryList;
 9     //排序的列表
10     private List<string> storeList;
11     //选择的索引
12     private int selectedItemIndex;
13     //邮政编码
14     private string homeZipCode;
15     //构造函数 用户数据的初始化
16     public ViewModel() {
17       groceryList = new ObservableCollection<GroceryItem>();
18       storeList = new List<string>();
19       selectedItemIndex = -1;
20       homeZipCode = "NY 10118";
21     }
22     public string HomeZipCode {
23       get { return homeZipCode; }
24       set { homeZipCode = value; NotifyPropertyChanged("HomeZipCode"); }
25     }
26     public int SelectedItemIndex {
27       get { return selectedItemIndex; }
28       set {
29         selectedItemIndex = value; NotifyPropertyChanged("SelectedItemIndex");
30       }
31     }
32     public ObservableCollection<GroceryItem> GroceryList {
33       get {
34         return groceryList;
35       }
36     }
37     public List<string> StoreList {
38       get {
39         return storeList;
40       }
41     }
42     //实现了Inotifychanged事件
43     public event PropertyChangedEventHandler PropertyChanged;
44     private void NotifyPropertyChanged(string propName) {

        if (PropertyChanged != null) {
 PropertyChanged(this, new PropertyChangedEventArgs(propName));
 }
 }
 }
}

这个viewmodel 是一个食品项目的集合代表了食品的列表。这个能使app的界面的数据能够动态更新,我使用了observecollection数据结构,这个observecollection类实现了集合的基本特点还声明了一个crud的事件,能够你更新了食物列表以后,ui界面也能够更新。. 

这个viewmodel的类实现了INotifyPropertyChanged接口,他有两个Observable的属性,首先是Home的邮政编码,在第三章中,我将会证明怎么创建flyout。第二个属性是是选择索引的类,他表示程序状态,使用食品列表选择时候总是保持一致、

这是一个简单的viewmodel, 对我而言,重要的是,后续的篇幅 ,我会演示如何使用数据绑定保持如何自动更新用户界面控件上面来

viewmodel 有了,休息一下。如何进入下一个议程,请听下次分解。

时间: 2024-11-17 18:15:39

手把手玩转win8开发系列课程(7)的相关文章

手把手玩转win8开发系列课程(23)

这节,我们来讨论①像程序中添加最复杂的flyout控件②创建包装类 (1)像程序中添加最复杂的flyout控件 手把手玩转win8开发系列课程(21)的时候了,我们已经把一个简单的FlyOut的文件添加到了项目中,我们觉得还不够,因此了,上节我们创建了一个复杂的控件.于是,我们来将其添加到项目中去,下列是添加这个控件的源码: 1 <!--flyouts 命名空间 指向MetroGrocer.Flyouts--> 2 <flyouts:HomeZipCodeFlyout x:Name=&q

手把手玩转win8开发系列课程(8)

这节,我们继续上节的一个议程. ①添加一个主页 现在我已经定义了一个ViewModel,我就开始整合项目.第一步就是添加主页到添加到项目中去.我明白项目为何吧页面创建为空白页面,但这个空白的页面起名字叫空白一点儿意义都没有吧,我这里需要给新页面起一个更有意义的页面.原先的空白页面,我已经吧他干掉了. 鄙人是个贱体,我更喜欢添加一些新的文件夹,使其更加的有层次.因此,我加了一个新的文件夹加做pages.在此文件夹下,我右击我添加了一个叫做list的xaml的文件. 特别提醒,如果你是xaml的一个

手把手玩转win8开发系列课程(5)

  前面第三节,我们对ui层大一统的技术--xaml技术有了一个概览.   这节中的我们正式以一个项目--食品管理程序从头到尾的开发的过程,来真真正正手把手进行win8开发.别看这是简简单单的项目,麻雀虽小,能够学win8的开发的方方面面--数据的绑定,各种各样的控件和xaml样式的引用等等.   在下图1,你会看到这个项目最终运行的效果(在模拟器中运行的). 项目的开篇介绍. 针对项目,首先,可以肯定告诉大家我写的这个项目的内容是针对程序猿们而不是对于这些设计妹妹,而且这个食品管理器不是一个完

手把手玩转win8开发系列课程(1)

win8操作系统推出一个多月了,我做win8开发也有2个多月了,也写了不少wi8开发的游戏开发的博文(这一系列我会继续的更新),在这里我准备重新推出一套win8的手把手的教程,来帮助更多人,走入win8开发的阵营. 这里我们做好一些win8前期的工作,安装win8及其对win8进行一些介绍.   Win8是由微软公司开发的,具有革命性变化的操作系统.该系统旨在让人们的日常电脑操作更加简单和快捷,主要是针对平板电脑等新一代的移动互联网操作系统,是为人们提供高效易行的工作环境Win8支持来自Inte

手把手玩转win8开发系列课程(2)

 对win8开发,上一节我们对win8进行了简单的介绍,这一节我们来瞧一瞧他的开发环境搭建.    前奏. 这里所讲的win8开发,主要是指Windows8 app store 上开发,及metro ui或叫morden ui 程序的开发.传统桌面应用程序,网站应用程序的win8开发和在win7,xp下一模一样,这里就不多做过多的赘述. 这里的开发运行环境必须是Windows8,开发工具可以用vs2012 express 版本,注意这里只能开发Windows8 app store的应用程序,下载

手把手玩转win8开发系列课程(3)

上节,我们已经搭建了他的开发环境,这节,我们对UI层大一统的技术--XAML技术进行一个概览. 先来搞清楚什么是XAML?所谓XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.  特别提醒,xaml中含有ML两个字,因此可以看出来他属于ML(mark Language)家族,这里有必要揭秘一下他的前世今生.      在xaml出现之前,微软技术的

手把手玩转win8开发系列课程(4)

上节我们说的windows8开发主要是研究开发windowsstore程序,那么我们这节重点讨论了windows store 究竟是何物?为什么平板电脑都有什么store?并且对这几个成熟的windows store程序进行简单的演示,从而比较win8平板电脑与其他的平板电脑有什么独特的地方. windows store 程序就是软件的开发者开发好了一个程序以后,只有且必须把相应的程序上传到微软的官方市场上,才能够让大庭广众使用.为什么会推出了这种机制了.这就有必要与现在的pc的程序安装来比较.

手把手玩转win8开发系列课程(6)

这节,揭秘工程继续. 揭秘 StandardStyles.xaml文件. common文件下所包括项目中要所使用各种各样的模板文件.如图所示: 别看这么多文件了,我这里关心StandardStyles.xaml文件,他有什么作用了,最明显的作用是这个文件包含了app.xaml中所引用的一些资源字典的数据.这些数据有究竟是什么了,我问你你看到的metro风格的窗体是哪儿规定,就是来自StandardStyles.xaml文件定义的各种各样的样式.你如果对xaml有所了解的话,一定对xaml中样式不

手把手玩转win8开发系列课程(28)

这节,我们讨论两个主题 ①打破视图 ②使用瓦片和徽章来更好的用户体验 如果你把断裂视图呈现给用户,你可以恢复到一个更广泛的布局时,与用户交互的应用在某些方面.为了证明这个道理,  我添加一个按钮到viewPage页面上.下列的源代码所示: 1 <StackPanel x:Name="TopRight" Background="#70a524" Grid.Column="1" 2 Grid.Row="0"> 3 &l

手把手玩转win8开发系列课程(27)

这节,我们讨论两个主题 ①打破视图 ②使用瓦片和徽章来更好的用户体验 如果你把断裂视图呈现给用户,你可以恢复到一个更广泛的布局时,与用户交互的应用在某些方面.为了证明这个道理,  我添加一个按钮到viewPage页面上.下列的源代码所示: 1 <StackPanel x:Name="TopRight" Background="#70a524" Grid.Column="1" 2 Grid.Row="0"> 3 &l