在现代软件开发中,CRUD(创建、读取、更新、删除)操作是应用程序中最常见的功能之一。为了提高开发效率和代码复用性,本文将介绍如何使用WPF(Windows Presentation Foundation)实现一个基于MVVM(Model-View-ViewModel)模式的通用CRUD控件。
开发一个可复用的控件,能够处理所有CRUD操作及其相关方面(如验证和重置),并便于开发具有最少代码的查找数据管理模块。
UI线框图包含两个主要视图,如图1所示:
视图#1:
视图#2:
该解决方案应用于Northwind数据库的两个模块:供应商和产品。本文将以产品模块为例进行演示,因为它具有更高级的场景。在演示中,使用了Unity作为IoC/DI容器,MVVMLight工具包和WPFModern UI库来设计主窗口和导航。
要运行演示,请执行以下步骤:
基于MVVM,主要依赖于多态性和泛型。点击查看完整的设计图。
解决方案目前依赖于Microsoft.Practices.ServiceLocation和EntityFramework。
1. 核心:
2. 视图层:
以下XAML片段来自ProductList.xaml用户控件,展示了GenericCrudControl的使用:
<crud:GenericCRUDControl>
<crud:GenericCRUDControl.SortingProperties>
<crud:SortingProperty DisplayName="产品名称" PropertyPath="ProductName"></crud:SortingProperty>
<crud:SortingProperty DisplayName="类别" PropertyPath="Category.CategoryName"></crud:SortingProperty>
<crud:SortingProperty DisplayName="供应商" PropertyPath="Supplier.ContactName"></crud:SortingProperty>
</crud:GenericCRUDControl.SortingProperties>
<crud:GenericCRUDControl.Columns>
<crud:CustomDataGridColumn Header="类别名称" BindingExpression="Category.CategoryName"></crud:CustomDataGridColumn>
<crud:CustomDataGridColumn Header="产品名称" BindingExpression="ProductName"></crud:CustomDataGridColumn>
<crud:CustomDataGridColumn ColumnType="TemplateColumn" Header="库存">
<crud:CustomDataGridColumn.DataGridColumnTemplate>
<DataTemplate>
<ProgressBar Maximum="150" Value="{Binding UnitsInStock}"></ProgressBar>
</DataTemplate>
</crud:CustomDataGridColumn.DataGridColumnTemplate>
</crud:CustomDataGridColumn>
<crud:CustomDataGridColumn Header="供应商名称" BindingExpression="Supplier.ContactName" Width="*"></crud:CustomDataGridColumn>
</crud:GenericCRUDControl.Columns>
</crud:GenericCRUDControl>
包含解决方案的骨干逻辑,如图示所示:
public class ProductsListViewModel : GenericCRUDBase<Product>
{
public ProductsListViewModel(ProductsSearchViewModel productsSearchViewModel,
ProductAddEditViewModel productAddEditViewModel)
: base(productsSearchViewModel, productAddEditViewModel)
{
ListingIncludes = new Expression<Func<Product, object>>[]
{
p => p.Category,
p => p.Supplier
};
}
}
它需要SearchCriteriaBase
ListingIncludes是一个lambda表达式数组,引用数据检索中需要包含的导航属性。
AddEditEntityBase
它具有ContentControl,将持有WPF引擎基于指定DataTemplate解析的具体视图。
SearchCriteriaBase
有一些委托用于在抽象逻辑之前/之后注入业务逻辑,例如:
以下截图展示了将WPFCrudControl应用于Northwind的Product模块的结果。