在本系列文章中,将探讨如何开发一个Metro风格的应用程序,名为Sharpy。这个应用程序将使用WCF进行服务端通信,并使用NHibernate进行数据持久化。本文将介绍整个系列文章的范围,并在高层次上讨论架构解决方案。
10月23日:目前正在为一个Metro应用程序开发一个新的项目:Sharpy。打算在应用程序的服务端使用WCFby Example中讨论的模式;目标是展示Metro应用程序的开发与迄今为止看到的应用程序类型有多相似。目前还没有代码可用,但希望这种情况很快就会改变。希望会喜欢它。
在前面的章节中,已经讨论了核心服务器组件的设计和实现。现在,准备设置一个客户端来与服务器端的服务和业务逻辑进行交互。
正如在系列文章开始时所指出的,富客户端基于WPF,并使用MVVM模式。假设读者熟悉WPF和MVVM的基本概念。
本章的源代码可以在Codeplex变更集73737中找到。eDirectory解决方案的最新代码可以在Codeplex中找到。
在设计富客户端时,使用的主要原则是模型应该包含尽可能多的信息,并使用XAML绑定功能,因此在视图中创建的代码非常少。ViewModel将负责创建视图和检索模型实例,这些实例直接绑定到视图。
由于这种方法,设计广泛使用了操作模式(RelayCommand)在模型上调用ViewModel中定义的方法,在视图中,依赖属性在XAML中用作扩展模型和视图之间绑定功能的方法。转换器在这种方法中对命令执行也很有用。在后续章节中,将演示ViewModel中INotifyPropertyChange模式的使用,以便模型和视图可以在绑定属性更改时相互通知。
本章介绍了eDirectory解决方案中的一个新项目:eDirectory.WPF。本章中的WPF项目由一个屏幕组成,允许用户创建和查看客户实体。遵循MVVM模式,为客户文件夹下的视图(XAML)、模型(DTOs)和ViewModel创建了三个文件。
模型非常简单,只是重用了在公共程序集中已经定义的DTO。这样,从服务中检索数据并轻松重用就变得非常简单。
public class CustomerModel
{
public CustomerDto NewCustomerOperation { get; set; }
public IList<CustomerDto> CustomerList { get; set; }
}
以下是XAML类的摘录:
<Window x:Class="eDirectory.WPF.Customer.View.CustomerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Customer View" Height="400" Width="400"
WindowStartupLocation="CenterScreen">
<Grid Name="MainLayout">
...
<GroupBox Header="New Customer" Margin="5" Padding="5" Grid.Row="0">
<Grid Name="NewCustomer">
...
<Label Grid.Column="0" Grid.Row="0">
First Name
</Label>
<TextBox Grid.Column="0" Grid.Row="1" Text="{Binding Path=Model.NewCustomerOperation.FirstName, Mode=TwoWay}">
</TextBox>
...
</Grid>
</GroupBox>
<GroupBox Header="List of Customers" Margin="5" Padding="5" Grid.Row="1">
<Grid Name="ListOfCustomers">
...
<tk:DataGrid Grid.Row="0" ... ItemsSource="{Binding Path=Model.CustomerList}">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="Customer Id" Binding="{Binding Path=CustomerId, Mode=OneWay}" />
...
</tk:DataGrid.Columns>
</tk:DataGrid>
...
</Grid>
</GroupBox>
...
</Grid>
</Window>
ViewModel的责任是创建视图的实例并使用调用服务器服务来检索模型。此时,ViewModel的实现非常简单:
public class CustomerViewModel
{
private readonly CustomerView View;
public CustomerViewModel()
{
View = new CustomerView();
View.DataContext = this;
View.ShowDialog();
}
public CustomerModel Model { get; set; }
}
在传统的WPF应用程序中,视图被设置为启动对象,在应用程序中情况并非如此。需要更多的灵活性,所以将在App.xaml.cs文件中创建一个BootStrapper方法,该方法创建一个专门的BootStrapper类的实例,然后创建CustomerViewModel的实例。
public partial class App : Application
{
private void BootStrapper(object sender, StartupEventArgs e)
{
var boot = new eDirectoryBootStrapper();
boot.Run();
new CustomerViewModel();
}
}