您的位置:首页 > 其它

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

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

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

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



图一

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

namespace MVVMDemo.Model
{
/// <summary>
/// 该类继承INotifyPropertyChanged,用于对属性值放生改变时的通知
/// 需要自定义实现一个对应的通知函数:FirePropertyChanged
/// </summary>
public class Person:INotifyPropertyChanged
{
private string _name;

public string Name
{
get { return _name; }
set {
if (value != _name)
{
_name = value;
FirePropertyChanged();
}
}
}

private int _age;

public int Age
{
get { return _age; }
set {
if (value != _age)
{
_age = value;
FirePropertyChanged();
}
}
}

public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}

public event PropertyChangedEventHandler PropertyChanged;

public void FirePropertyChanged([CallerMemberName]string propertyName=null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}


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

namespace MVVMDemo.ViewModel
{
public  class GetInfo
{
public Person person ;

public GetInfo(string name="Demo", int age=0)
{
person = new Person(name, age);
}

public Person GetPerson()
{
return person;
}

public void SetPerson(string name, int age)
{
person.Name = name;
person.Age = age;
}
}
}


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

<StackPanel>
<GridView Header="设置值:" FontSize="20">
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:" VerticalAlignment="Center"/>
<TextBox x:Name="tb_Name" Text="{Binding Name}" Width="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Age" VerticalAlignment="Center"/>
<TextBox x:Name="tb_Age" Text="{Binding Age}" Width="200" Margin="12"/>
</StackPanel>
<Button Content="修改当前值" Click="ButtonBase_OnClick"/>

<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:" VerticalAlignment="Center" FontSize="20"/>
<TextBlock Text="{Binding Name}" Width="200" FontSize="20"/>
</StackPanel>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="Age" VerticalAlignment="Center" FontSize="20"/>
<TextBlock Text="{Binding Age}" Width="200" Margin="12" FontSize="20"/>
</StackPanel>
</StackPanel>
</GridView>
</StackPanel>


namespace MVVMDemo
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
private GetInfo info;

public MainPage()
{
this.InitializeComponent();

this.NavigationCacheMode = NavigationCacheMode.Required;
}

/// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。
/// 此参数通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: 准备此处显示的页面。

if (e.NavigationMode == NavigationMode.New)
{
info = new GetInfo();
this.DataContext = info.GetPerson();
}

// TODO: 如果您的应用程序包含多个页面,请确保
// 通过注册以下事件来处理硬件“后退”按钮:
// Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
// 如果使用由某些模板提供的 NavigationHelper,
// 则系统会为您处理该事件。
}

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
info.SetPerson(tb_Name.Text, Convert.ToInt32(tb_Age.Text));
this.DataContext = info.GetPerson();
}
}
}


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





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

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

如果你感觉这篇博文对你有用,请记得点赞哦!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: