数据绑定使用了ObservableCollection<T> 类来实现,ViewModel通过继承GalaSoft.MvvmLight.ViewModelBase类来实现,Command
使用GalaSoft.MvvmLight.Command.RelayCommand<T>来实现。
ObservableCollection<T>表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。
客户列表绑定客户的名字、QQ、地址信息,单击的时候显示客户的全部详细信息。
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 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" >
< 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" >
< 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 >
</ 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 >
</
Grid
>
</
phone:PhoneApplicationPage
>
ViewModel层
ViewModelLocator是对ViewModel进行初始化和清理的集中处理的类 添加资源的时候只需要添加这一个类就可以了。
ViewModelLocator.cs
namespace
MvvmLight5.ViewModel
{
public
class
ViewModelLocator {
private
static
MainViewModel _main;
/// <summary> /// 初始化 在这里创建ViewModel 可以将多个ViewModel在这里一起创建 /// </summary>
/// <summary> /// 初始化 在这里创建ViewModel 可以将多个ViewModel在这里一起创建 /// </summary>
public
ViewModelLocator()
{
CreateMain();
}
/// <summary> /// 获取MainViewModel的静态的实例对象 /// </summary>
}
/// <summary> /// 获取MainViewModel的静态的实例对象 /// </summary>
public
static
MainViewModel MainStatic
{
get
{
if
(_main
==
null
)
{
CreateMain();
}
return _main;
return _main;
}
}
MainViewModel.cs
using
System.Collections.ObjectModel;
using
GalaSoft.MvvmLight;
using
GalaSoft.MvvmLight.Command;
using
MvvmLight5.Model;
namespace MvvmLight5.ViewModel
namespace MvvmLight5.ViewModel
{
public
class
MainViewModel : ViewModelBase
{
/// <summary> /// 数据绑定的客户列表 /// </summary>
/// <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 " ; }
public string PageName { get { return " 客户列表如下: " ; } }
public string Welcome { get { return " Welcome to MVVM Light " ; }
}
/// <summary> /// 初始化 MainViewModel
/// <summary> /// 初始化 MainViewModel
///
</summary>
public
MainViewModel()
{
//
初始化Command
DetailsPageCommand
=
new
RelayCommand
<
Customer
>
( ( msg )
=>
GoToDetailsPage( msg ) );
}
private object GoToDetailsPage( Customer 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
namespace MvvmLight5.Model
{
public
class
CustomerCollection
{
//
在这里绑定数据使用了ObservableCollection<T> 类
private
readonly
ObservableCollection
<
Customer
>
_customers
=
new
ObservableCollection
<
Customer
>
();
public
Observable Collection
<
Customer
>
Customers {
get
{
return
_customers; } }
public Customer GetCustomerByID( int id ) { return _customers[ id ]; }
public Customer Collection()
public Customer GetCustomerByID( int id ) { return _customers[ id ]; }
public Customer Collection()
{
try
{
GenerateCustomers();
}
catch
( Exception e )
{
System.Windows.MessageBox.Show(
"
Exception:
"
+
e.Message );
}
}
//
初始化数据
public
void
GenerateCustomers()
{
_customers.Add(
new
Customer(
1
,
"
黄小琥
"
,
"
台湾高雄市十六街8号
"
,
"
高雄
"
,
"
13457789907
"
,
"
3232
"
,
"
huangxiaohu@qq.com
"
) );
_customers.Add(
new
Customer(
2
,
"
李开复
"
,
"
北京市东城区十六街8号
"
,
"
北京
"
,
"
136589907
"
,
"
787222894
"
,
"
huasdsdu@qq.com
"
));
_customers.Add(
new
Customer(
3
,
"
周杰伦
"
,
"
台湾台北市十六街8号
"
,
"
台北
"
,
"
145455779907
"
,
"
2323266
"
,
"
232@qq.com
"
));
_customers.Add(
new
Customer(
4
,
"
郎咸平
"
,
"
香港十六街8号
"
,
"
香港
"
,
"
145489907
"
,
"
787222894
"
,
"
6ggg@qq.com
"
));
_customers.Add(
new
Customer(
5
,
"
加菲猫
"
,
"
高雄市十六街8号
"
,
"
高雄市
"
,
"
15777789907
"
,
"
333434
"
,
"
2323@qq.com
"
));
_customers.Add(
new
Customer(
6
,
"
灰太狼
"
,
"
台湾第三代市十六街8号
"
,
"
高雄市
"
,
"
134357789907
"
,
"
23232
"
,
"
3232@qq.com
"
));
_customers.Add(
new
Customer(
7
,
"
喜洋洋
"
,
"
台湾高雄市十六街8号
"
,
"
高雄市
"
,
"
134544589907
"
,
"
23232777
"
,
"
88sds@qq.com
"
));
_customers.Add(
new
Customer(
8
,
"
春哥
"
,
"
台湾所得税十六街8号
"
,
"
高雄市
"
,
"
13453445907
"
,
"
888888
"
,
"
sdsgg@qq.com
"
)); }
}
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 -->
<
Application.Resources
>
<
vm:ViewModelLocator
x:Key
="Locator"
d:IsDataSource
="True"
/>
</
Application.Resources
>
< Application.ApplicationLifetimeObjects >
< 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 >
</ Application >
cs
//
清理ViewModel资源
private
void
Application_Closing(
object
sender, ClosingEventArgs e )
{
ViewModelLocator.ClearMain();
}