65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XAF 构建简单的联系人应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (6投票s)

2013年8月9日

CPOL

4分钟阅读

viewsIcon

36431

如何使用 XAF 构建一个简单的联系人应用程序

引言

每年,我的家人都会疯狂地尝试向家人和朋友发送节日贺卡(晚了)。今年,我发誓要有所不同。我最近开始熟悉 DevExpress eXpress 应用程序框架 (XAF),并决定进行测试。尽管我在 DevExpress 工作,担任分析方面的产品经理,但我实际上并没有过多地使用 XAF。我现在有理由了。

有大量的文档(参见这个 起点),可能有点让人不知所措,所以我决定从最简单的事情开始 – 制作合适的数据结构,看看会发生什么。

创建项目

创建项目非常简单

New XAF Cross-Platform Application

只需选择跨平台应用程序模板,我们就开始了

XAF Cross-Platform Application Solution

这个过程将自动为我们创建几个项目。我们将在本技巧中关注的部分是基础模块和 Windows 项目。

添加一些代码

我们的应用程序主要处理家庭以及家庭中的人员。每个家庭应该能够有一个或多个成员。在 XAF 中,我们需要添加两个域对象来表示这种类型的数据:一个用于 Household ,一个用于 Person。要添加域对象,只需右键单击 BusinessObjects 文件夹并选择“添加新建”

New Domain Object

Domain 对象保存了 Household Person 实体的属性。鉴于这段代码有点乏味,我们添加了一些 CodeRush 模板 来加快速度。

CodeRush XAF Property Templates

我们还可以使用 CodeRush 来生成对象之间的关联

CodeRush XAF Relationship Templates

以下是两个 Domain 对象并排显示

Household 域对象

[DefaultClassOptions, ImageName("BO_Address")]
public class Household : BaseObject
{ 
    public Household(Session session)
        : base(session)
    {
    }
 
    public override void AfterConstruction()
    {
        base.AfterConstruction();
    }
 
    // Fields...
    private string _address;
    private string _phone;
    private string _zip;
    private string _state;
    private string _city;
    private string _name;
 
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            SetPropertyValue("Name", ref _name, value);
        }
    }
 
    public string Address
    {
        get
        {
            return _address;
        }
        set
        {
            SetPropertyValue("Address", ref _address, value);
        }
    }
 
    public string City
    {
        get
        {
            return _city;
        }
        set
        {
            SetPropertyValue("City", ref _city, value);
        }
    }
 
    public string State
    {
        get
        {
            return _state;
        }
        set
        {
            SetPropertyValue("State", ref _state, value);
        }
    }
 
    public string Zip
    {
        get
        {
            return _zip;
        }
        set
        {
            SetPropertyValue("Zip", ref _zip, value);
        }
    }
 
    public string Phone
    {
        get
        {
            return _phone;
        }
        set
        {
            SetPropertyValue("Phone", ref _phone, value);
        }
    }
 
    [Association("Household-Members")]
    public XPCollection<person> Members
    {
        get
        {
            return GetCollection<person>("Members");
        }
    }
}

Person 域对象

[DefaultClassOptions, ImageName("BO_Person")]
public class Person : BaseObject
{
    public Person(Session session)
        : base(session)
    {
    }
 
    public override void AfterConstruction()
    {
        base.AfterConstruction();
    }
 
    // Fields...
    private Household _household;
    private DateTime _birthDate;
    private string _phone;
    private string _cell;
    private string _email;
    private string _lastName;
    private string _firstName;
 
    public string FirstName
    {
        get
        {
            return _firstName;
        }
        set
        {
            SetPropertyValue("FirstName", ref _firstName, value);
        }
    }
 
    public string LastName
    {
        get
        {
            return _lastName;
        }
        set
        {
            SetPropertyValue("LastName", ref _lastName, value);
        }
    }
 
    public DateTime BirthDate
    {
        get
        {
            return _birthDate;
        }
        set
        {
            SetPropertyValue("BirthDate", ref _birthDate, value);
        }
    }
 
    public string Email
    {
        get
        {
            return _email;
        }
        set
        {
            SetPropertyValue("Email", ref _email, value);
        }
    }
 
    public string Cell
    {
        get
        {
            return _cell;
        }
        set
        {
            SetPropertyValue("Cell", ref _cell, value);
        }
    }
 
    public string Phone
    {
        get
        {
            return _phone;
        }
        set
        {
            SetPropertyValue("Phone", ref _phone, value);
        }
    }
 
    [Association("Household-Members")]
    public Household Household
    {
        get
        {
            return _household;
        }
        set
        {
            SetPropertyValue("Household", ref _household, value);
        }
    }
}

除了这些属性之外,我在类中添加的唯一其他内容是图像属性 ([ImageName("BO_Person")]),它指定系统在呈现域类时应该使用的图标。或者,可以使用模型编辑器通过几个步骤来更改图标。

首先,打开模型编辑器

XAF Model Editor - Navigation

然后,选择合适的图标

XAF Icon Selection

我做的最后一件事是更改了几个选项,这些选项更改了 Windows 应用程序(在 Windows 模块中)的外观、感觉和导航

XAF Model Editor - Options

关于这些类型的自定义的最佳部分是,最终用户可以通过运行可执行文件并自行进行更改来做出相同的更改

XAF Model Editor - User Access

就是这样!现在是时候运行应用程序了。

最终结果

运行程序后,您(和您的用户)可以进一步自定义应用程序以满足您的需求。

XAF Layout Customization

由于默认布局对我来说效果不佳,您可以看到我如何手动更改应用程序的布局

XAF Layout Customization

经过最后几次修改后,最终结果是一个完全功能的应用程序,该应用程序直接从数据库保存和加载信息。

XAF DXContact Application

当您第一次运行 XAF 应用程序时,底层框架会查看您的域类以创建相应的数据库表和关系。默认情况下,系统将尝试连接到 SQL Server 的默认 SQLExpress 实例,并创建一个与您的应用程序同名的数据库。这可以通过转到 WinApplication 设计器并更改连接的相应属性来轻松更改

XAF Connection Properties

摘要

整个过程的最佳部分是框架默认提供给您的许多功能。基于对象的纯 CRUD 应用程序的创建过程也非常简单

  1. 考虑域类和关系
  2. 创建域类
  3. 运行应用程序并自定义导航和外观
显然,并非每个应用程序都像创建、读取和更新普通业务对象那样简单。在后续文章中,我想看看 XAF 如何处理“脱轨”,也就是说,自定义和扩展应用程序有多容易?敬请关注!

奖励

在技巧的开头,我建议我们创建一个跨平台应用程序。事实证明,将 Web 应用程序设置为启动项目并运行它会产生以下结果

无需任何额外努力,即可生成一个功能等同于 Windows 应用程序的完整 Web 应用程序。

这可能最终会减轻假期压力。

是的……我希望几年前就知道这个了。

一如既往,如果有任何评论和/或问题,请随时与我联系!

Seth Juarez
电子邮件:sethj@devexpress.com
推特:@SethJuarez

下载并试用

下载免费副本 的 DevExpress WPF 控件,这些控件可帮助您使用多功能 MVVM 框架构建丰富而强大的用户界面。

© . All rights reserved.