Windows Phone 7 MVVM模式数据绑定和传递参数

数据绑定使用了ObservableCollection<T> 类来实现,ViewModel通过继承GalaSoft.MvvmLight.ViewModelBase类来实现,Command

使用GalaSoft.MvvmLight.Command.RelayCommand<T>来实现。

ObservableCollection<T>表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。

客户列表绑定客户的名字、QQ、地址信息,单击的时候显示客户的全部详细信息。

Windows Phone 7 MVVM模式数据绑定和传递参数Windows Phone 7 MVVM模式数据绑定和传递参数

View层

  
    
< phone:PhoneApplicationPage
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone
="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell
="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Custom
="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:GalaSoft_MvvmLight_Command ="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7"
x:Class
="MvvmLight5.MainPage"
FontFamily
=" {StaticResource PhoneFontFamilyNormal} "
FontSize
=" {StaticResource PhoneFontSizeNormal} "
Foreground
=" {StaticResource PhoneForegroundBrush} "
SupportedOrientations
="Portrait"
Orientation
="Portrait"
mc:Ignorable
="d"
d:DesignWidth
="480"
d:DesignHeight
="768"
shell:SystemTray.IsVisible
="True"
DataContext
=" {Binding Main, Source={StaticResource Locator}} " >
<!-- 绑定ViewModel中的Main实例对象 资源在App.xaml中进行了加载 -->

< Grid
x:Name ="LayoutRoot"
Background
="Transparent" >
< Grid.RowDefinitions >
< RowDefinition Height ="Auto" />
< RowDefinition Height ="*" />
</ Grid.RowDefinitions >

< StackPanel x:Name ="TitlePanel" Grid.Row ="0" Margin ="24,24,0,12" >
< TextBlock
x:Name ="ApplicationTitle"
Text
=" {Binding ApplicationTitle} "
Style
=" {StaticResource PhoneTextNormalStyle} " />
< TextBlock
x:Name ="PageTitle"
Text
=" {Binding PageName} "
Margin
="-3,-8,0,0"
Style
=" {StaticResource PhoneTextTitle1Style} " />
</ StackPanel >

< Grid x:Name ="ContentGrid" Grid.Row ="1" >
< ListBox x:Name ="PersonListBox" Margin ="10" ItemsSource =" {Binding Customers} " >
<!-- 绑定MainViewModel的Customers数据 -->
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel >
< StackPanel
x:Name ="DataTemplateStackPanel"
Orientation
="Horizontal" >
< TextBlock
x:Name ="Name"
Text
=" {Binding Name} "
Margin
="0,0,5,0"
Style
=" {StaticResource PhoneTextExtraLargeStyle} " />
< TextBlock
x:Name ="QQ"
Text
=" {Binding QQ} "
Margin
="0"
Style
=" {StaticResource PhoneTextExtraLargeStyle} " />
</ StackPanel >
< TextBlock
x:Name ="Email"
Text
=" {Binding Address} "
Margin
="0"
Style
=" {StaticResource PhoneTextSubtleStyle} " />

</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
<!-- 添加System.Windows.Interactivity触发器处理事件,放在ListBox里面 -->
< Custom:Interaction.Triggers >
<!-- 当选中客户的时候触发该事件 -->
< Custom:EventTrigger EventName ="SelectionChanged" >
< GalaSoft_MvvmLight_Command:EventToCommand x:Name ="SelectionCommand" Command =" {Binding DetailsPageCommand, Mode=OneWay} " CommandParameter =" {Binding SelectedItem, ElementName=PersonListBox} " />
<!-- 传递的参数为ListBox选中的Customer对象 -->
</ Custom:EventTrigger >
</ Custom:Interaction.Triggers >
</ ListBox >

</ Grid >
</ Grid >
</ phone:PhoneApplicationPage >

ViewModel层

ViewModelLocator是对ViewModel进行初始化和清理的集中处理的类  添加资源的时候只需要添加这一个类就可以了。

ViewModelLocator.cs

  
    
namespace MvvmLight5.ViewModel
{
public class ViewModelLocator
{
private static MainViewModel _main;

/// <summary>
/// 初始化 在这里创建ViewModel 可以将多个ViewModel在这里一起创建
/// </summary>
public ViewModelLocator()
{
CreateMain();

}

/// <summary>
/// 获取MainViewModel的静态的实例对象
/// </summary>
public static MainViewModel MainStatic
{
get
{
if (_main == null )
{
CreateMain();
}

return _main;
}
}

/// <summary>
/// 获取MainViewModel的实例对象
/// </summary>
public MainViewModel Main
{
get
{
return MainStatic;
}
}

/// <summary>
/// 清理MainViewModel 退出程序的时候进行清理 在App.xmal.cs中调用
/// </summary>
public static void ClearMain()
{
_main.Cleanup();
_main
= null ;
}

/// <summary>
/// 创建MainViewModel
/// </summary>
public static void CreateMain()
{
if ( _main == null )
{
_main
= new MainViewModel();
}
}
}
}

MainViewModel.cs

  
    
using System.Collections.ObjectModel;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using MvvmLight5.Model;

namespace MvvmLight5.ViewModel
{
public class MainViewModel : ViewModelBase
{


/// <summary>
/// 数据绑定的客户列表
/// </summary>
public ObservableCollection < Customer > Customers
{
get
{
var customerCollection
= new CustomerCollection();
return customerCollection.Customers;
}
}
// 定义Command
public RelayCommand < Customer > DetailsPageCommand
{
get ;
private set ;
}

public string ApplicationTitle
{
get
{
return " MVVM LIGHT " ;
}
}

public string PageName
{
get
{
return " 客户列表如下: " ;
}
}

public string Welcome
{
get
{
return " Welcome to MVVM Light " ;
}
}

/// <summary>
/// 初始化 MainViewModel
/// </summary>
public MainViewModel()
{
// 初始化Command
DetailsPageCommand = new RelayCommand < Customer > ( ( msg ) => GoToDetailsPage( msg ) );
}

private object GoToDetailsPage( Customer msg )
{
System.Windows.MessageBox.Show(
" 客户的详细资料如下 名字: " + msg.Name + " 城市: " + msg.City + " 地址: " + msg.Address + " 电话: " + msg.Phone + " QQ: " + msg.QQ);
return null ;
}
}
}

Model层

Customers.cs

  
    
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace MvvmLight5.Model
{
public class CustomerCollection
{
// 在这里绑定数据使用了ObservableCollection<T> 类
private readonly ObservableCollection < Customer > _customers = new ObservableCollection < Customer > ();
public ObservableCollection < Customer > Customers
{
get { return _customers; }
}

public Customer GetCustomerByID( int id )
{
return _customers[ id ];
}

public CustomerCollection()
{
try
{
GenerateCustomers();
}
catch ( Exception e )
{
System.Windows.MessageBox.Show(
" Exception: " + e.Message );
}
}
// 初始化数据
public void GenerateCustomers()
{
_customers.Add(
new Customer( 1 , " 黄小琥 " , " 台湾高雄市十六街8号 " , " 高雄 " , " 13457789907 " , " 3232 " , " [email protected] " ) );
_customers.Add(
new Customer( 2 , " 李开复 " , " 北京市东城区十六街8号 " , " 北京 " , " 136589907 " , " 787222894 " , " [email protected] " ));
_customers.Add(
new Customer( 3 , " 周杰伦 " , " 台湾台北市十六街8号 " , " 台北 " , " 145455779907 " , " 2323266 " , " [email protected] " ));
_customers.Add(
new Customer( 4 , " 郎咸平 " , " 香港十六街8号 " , " 香港 " , " 145489907 " , " 787222894 " , " [email protected] " ));
_customers.Add(
new Customer( 5 , " 加菲猫 " , " 高雄市十六街8号 " , " 高雄市 " , " 15777789907 " , " 333434 " , " [email protected] " ));
_customers.Add(
new Customer( 6 , " 灰太狼 " , " 台湾第三代市十六街8号 " , " 高雄市 " , " 134357789907 " , " 23232 " , " [email protected] " ));
_customers.Add(
new Customer( 7 , " 喜洋洋 " , " 台湾高雄市十六街8号 " , " 高雄市 " , " 134544589907 " , " 23232777 " , " [email protected] " ));
_customers.Add(
new Customer( 8 , " 春哥 " , " 台湾所得税十六街8号 " , " 高雄市 " , " 13453445907 " , " 888888 " , " [email protected] " ));

}
}

public class Customer
{
public int ID { get ; set ; }

public string Name { get ; set ; }

public string Address { get ; set ; }

public string City { get ; set ; }

public string Phone { get ; set ; }

public string QQ { get ; set ; }

public string Email { get ; set ; }

public Customer()
{ }

public Customer(
int id,
string name,
string address,
string city,
string phone,
string qq,
string email )
{
ID
= id;
Name
= name;
Address
= address;
City
= city;
Phone
= Phone;
QQ
= qq;
Email
= email;
}
}
}

App.xaml 程序初始化处理

  
    
< Application x:Class ="MvvmLight5.App"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone
="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell
="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable
="d"
xmlns:vm
="clr-namespace:MvvmLight5.ViewModel" >

<!-- Application Resources -->
< Application.Resources >
< vm:ViewModelLocator x:Key ="Locator"
d:IsDataSource
="True" />
</ Application.Resources >

< Application.ApplicationLifetimeObjects >
<!-- Required object that handles lifetime events for the application -->
< shell:PhoneApplicationService Launching ="Application_Launching"
Closing
="Application_Closing"
Activated
="Application_Activated"
Deactivated
="Application_Deactivated" />
</ Application.ApplicationLifetimeObjects >

</ Application >

cs

  
    
// 清理ViewModel资源
private void Application_Closing( object sender, ClosingEventArgs e )
{
ViewModelLocator.ClearMain();
}

你可能感兴趣的:(windows phone)