我前一篇文章“XAF之 未解决——无法显示包含nonpersistent对象的ListView”,在数日的搜索下终于解决了,中间还遇到DEV网站维护的苦苦等待,最终还是发现了问题所在,我使用的dev版本是2.5,而在该版本中无法在ListView或DetailView中显示Nonpersistent 对象,会抛出空指针异常,后来我尝试升级到2.11版本,问题不存在了,几天几夜的苦恼终于找到了结果,虽然结果是这样,但总是是有了结果。为了不负这3天熬红眼,还是简单描述一下该主题:怎样在ListView中显示Nonpersistent Object。
1.创建一个BO,用NonPersistentAttribute特性修饰该类;
using System;
using DevExpress.Xpo;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
namespace NonPersistentSolution.Module
{
[NonPersistent]
public class MyNonPersistentObject : XPObject
{
private static int myId = 0;
public MyNonPersistentObject(Session session)
: base(session)
{
Oid = ++myId;
}
public override void AfterConstruction()
{
base.AfterConstruction();
// Place here your initialization code.
}
public string ObjectName
{
get { return GetPropertyValue<string>("ObjectName"); }
set { SetPropertyValue<string>("ObjectName", value); }
}
}
}
其中,myId充当该类的主键。
2.添加一个ViewController,并在该ViewController中添加一个PopupWindowShowAction,并订阅其CustomizePopupWindowParams事件。
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.Persistent.Base;
namespace NonPersistentSolution.Module
{
public partial class ViewController1 : ViewController
{
public ViewController1()
{
InitializeComponent();
RegisterActions(components);
}
private void popupWindowShowAction1_CustomizePopupWindowParams(object sender, CustomizePopupWindowParamsEventArgs e)
{
IObjectSpace objectspace = ObjectSpaceInMemory.CreateNew();
CollectionSource cs = new CollectionSource(objectspace, typeof(MyNonPersistentObject));
MyNonPersistentObject mo = objectspace.CreateObject<MyNonPersistentObject>();
mo.ObjectName = "A NonPersistentObject";
cs.Add(mo);
ListView view = Application.CreateListView(Application.FindListViewId(typeof(MyNonPersistentObject)), cs, false);
e.View = view;
}
}
}
在
CustomizePopupWindowParams处理函数中用到了ObjectSpaceInMemory,该类是一个静态类,仅提供了两个CreateNew静态方法,用于创建一个ObjectSpace对象,该ObjectSpace使用内存作为存储介质,适用于保存NonPersistent对象,唯一要求是该ObjectSpace持有的对象必须用NonPersistentAttribute修饰,然后其他使用方法和普通ObjectSpace没有区别。实际上,ObjectSpaceInMemory创建了一个DataSet,将所有数据都保存在里面。
另外,CollectionSource主要供ListView显示其拥有的对象集合。
下面是效果图:
另外附上一张数据库的截图,可以看到数据库中的确没有创建MyNonPersistentObject表(如果有就奇怪了,算我画蛇添足)。