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

15.2 XAF 有什么新功能

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2015年11月29日

CPOL

4分钟阅读

viewsIcon

20635

15.2 版本为 XAF (win) 开发者带来了什么?

引言

作为一名有着 15 年以上经验的活跃开发者,我见证了不少框架的兴衰,每个框架都有其优缺点……几年前,我有机会在一个决定从 Delphi 迁移到 .NET 的公司中引入 .NET。

虽然我意识到这是一项艰巨的任务,但我知道我该往哪里去。XAF 为我提供了许多功能和开箱即用的功能,让我事半功倍。多年的持续改进,让我们迎来了今天的 15.2 版本。

让我们来看看 15.2 版本为我们准备了什么。

关注领域

鉴于我目前参与的项目性质,主要关注点将是 Winforms 和 EF,但也有一些针对 Web 应用程序的改进值得一提。

有什么新内容

ASP.NET Maps 模块

新的 Maps 模块允许我们在地图上可视化任何数据。

所以,如果我想展示全球门店的收入,或者在地图上标出其位置?Maps 模块将能够帮助你。

只需要写一小段代码即可自定义底层的 dxMap

using DevExpress.Persistent.Base;

namespace DevExpress.ExpressApp.Maps.Web.Controllers {
   public class MapCenterController : ObjectViewController<ListView, Store> {
       protected override void OnViewControlsCreated() {
           base.OnViewControlsCreated();
           ((WebMapsListEditor)View.Editor).MapViewer.ClientSideEvents.Customize = GetCustomizeScript();
       }

       private string GetCustomizeScript() {
           return @"function(sender, map) {
                  map.option('center', 'Brooklyn Bridge,New York,NY');
                  map.option('autoAdjust', false);
                  }";
       }
   }
}

验证模块 (Win + Web)

内置验证一直是 XAF 的一个强项,很少有场景是内置功能无法覆盖的。直到 15.1 版本,验证是在保存更改时触发,或者在按下验证按钮时手动触发。在 15.2 版本中,对于一部分验证规则,验证会在输入焦点改变后立即发生。这里重要的是,即时验证的规则不需要从服务器收集任何额外数据。

以下规则可用于即时验证

RuleRequiredField

要求 Property 有值。

RuleRegularExpression

通过正则表达式验证值。

RuleStringComparison

通过 string 值比较(Contains, EndsWith, Equals, NotEquals, StartsWith)验证值。

RuleValueComparison

比较例如 dateint 属性的值(Equals, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, NotEquals

RuleRange

检查值是否在指定范围内。

即时验证会在属性不符合其规则时弹出红色的错误图标。

详细视图布局

一如既往,有一些更新有助于整体发展。

我们中的许多人更喜欢使用设计器(Model Editor),但也有人更喜欢在代码中进行……从现在开始,可以通过 DetailViewLayout 属性在代码中使用修改详细视图。

就像这样简单

public class Contact {
 [Browsable(false)]
 public int ID { get; private set; }

 [DetailViewLayoutAttribute(LayoutColumnPosition.Left)]
 public string FirstName { get; set; }

 [DetailViewLayoutAttribute(LayoutColumnPosition.Right)]
 public string LastName { get; set; }

 [DetailViewLayoutAttribute("FullName", 0)]
 public string FullName { get { return FirstName + " " + LastName; } }

 [DetailViewLayoutAttribute(LayoutColumnPosition.Left)]
 public string Email { get; set; }

 [DetailViewLayoutAttribute(LayoutColumnPosition.Right)]
 public virtual Contact Manager { get; set; }
 [DetailViewLayoutAttribute(LayoutColumnPosition.Left)]
 public DateTime? Birthday { get; set; }

 [FieldSize(FieldSizeAttribute.Unlimited)]
 [DetailViewLayoutAttribute("NotesAndRemarks", LayoutGroupType.TabbedGroup, 100)]
 public string Notes { get; set; }

 [FieldSize(FieldSizeAttribute.Unlimited)]
 [DetailViewLayoutAttribute("NotesAndRemarks", LayoutGroupType.TabbedGroup, 100)]
 public string Remarks { get; set; }
}

重置视图设置

使用 XAF 的一个好处是为最终用户提供了自定义视图和布局的选项。从现在起,用户只需单击一个按钮即可恢复到默认设置。

填补差距

虽然 XAF 最初只支持 Xpo(DevExpress ORM),但现在也支持 EF,在我看来,差距正在迅速缩小…… :-)

15.2 版本中的众多改进之一就是对此的一个很好的例子。

作为例子,我们将看看如何使用 ObjectSpace 进行查询。

在 15.2 版本之前,如果我们想使用 LINQ,我们需要这样做:

ObjectQuery<Payment> query = 
((EFObjectSpace)View.ObjectSpace).ObjectContext.CreateQuery<Payment>("Payments");

object obj = query.Where<Payment>(p => p.Hours == 4).FirstOrDefault();

使用 Xpo 时,我们可以做到:

XPQuery<Payment> query = Session.DefaultSession.Query<Payment>();

object obj = query.Where(p => p.Hours == 4).FirstOrDefault();

两种不同的方法,但结果相似。

从 15.2 版本开始,这已在 IOjbectSpace 接口中实现,因此 Xpo 和 EF 可以使用相同的方法。

var query = ObjectSpace.GetObjectsQuery<Payment>();

object obj = query.Where(p => p.Hours == 4).FirstOrDefault();

对许多人来说,这可能不是什么大事,但对我来说,这很重要…… KISS(保持简单,愚蠢)。

UX Web 增强功能

在 15.1 版本中,模板已针对触摸支持进行了优化,在 15.2 版本中,这些功能得到了改进,并已准备好在生产环境中使用。

目前还没有真正使用它,但你可以阅读所有相关信息 在这里。以下截图也很好地说明了它的内容。

为什么选择 DevExpress?

如果你想知道为什么 DevExpress 能在我的项目中产生不同,让我用一个简单的例子来解释。

在我开始最后一个大型 XAF 项目时,EF 还没有像现在这样得到支持,但是有了出色的 DevExpress 支持,我能够将我们的遗留数据库集成到 XAF 框架中。Xaf 不支持多个数据库,因此我向他们提出了我的需求,不久之后,解决方案(见下图)被实施,并附有一篇博客文章,你可以在 这里 阅读。

总结

本技巧主要关注 XAF,DevExpress 15.2 Universal 还有更多内容提供给我们。我非常喜欢写这个技巧,希望你觉得它有用!如果觉得没用,请告诉我!

 

© . All rights reserved.