欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

在WindowsPhone开发中使用MVVM设计模式,windowsphonemvvm

来源: 开发者 投稿于  被查看 32282 次 评论:33

在WindowsPhone开发中使用MVVM设计模式,windowsphonemvvm


相信.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=0)
 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 }

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

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

 

相关频道:

用户评论