根据 XAF 文档,默认情况下 DataSourceXXX 属性应该仅适用于业务对象类型,因此此处不能使用 System.Type。也就是说,作为替代解决方案,您可以创建一个非持久性包装 POCO 并使用 DataSourcePropertyAttribute 来提供过滤的查找数据源。在通过非持久属性更新和显示持久属性的非常有趣的方法中找到类似任务的示例代码
编辑:
这也是您的特定情况的一些示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.ExpressApp.DC;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
using DevExpress.Xpo;
namespace SimpleProjectManager.Module.BusinessObjects {
[DomainComponent]
public class NonPersistentTypeWrapper {
public string FullName { get; set; }
}
[DefaultClassOptions]
public class PersistentTestObject : BaseObject {
public PersistentTestObject(Session session) : base(session) { }
[Persistent("StringColumnNameInDb")]
private string stringFieldThoseValueIsStoredInDb;
private NonPersistentTypeWrapper _TypeProperty;
[NonPersistent, DataSourceProperty("TypesDataSource")]
public NonPersistentTypeWrapper TypeProperty {
get {
if(_TypeProperty == null && !string.IsNullOrEmpty(stringFieldThoseValueIsStoredInDb)) {
_TypeProperty = TypesDataSource.Single(v => v.FullName == stringFieldThoseValueIsStoredInDb);
}
return _TypeProperty;
}
set {
SetPropertyValue<NonPersistentTypeWrapper>("TypeProperty", ref _TypeProperty, value);
if(!IsLoading && !IsSaving) {
stringFieldThoseValueIsStoredInDb = value != null ? value.FullName : string.Empty;
OnChanged("stringFieldThoseValueIsStoredInDb");
}
}
}
private List<NonPersistentTypeWrapper> _TypesDataSource = null;
protected IList<NonPersistentTypeWrapper> TypesDataSource {
get {
if(_TypesDataSource == null) {
_TypesDataSource = new List<NonPersistentTypeWrapper>();
foreach(Type type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()) {
if(type.FullName.Contains("Planning")) {// some basic filtering...
_TypesDataSource.Add(new NonPersistentTypeWrapper() { FullName = type.FullName });
}
}
}
return _TypesDataSource;
}
}
}
}
结果:
虽然这看起来有点复杂,但这种方法是通用的,当您需要通过非持久属性更新持久属性时,可以将其用于任何属性类型(不仅适用于 System.Type)。我希望我的解决方案现在更清楚了。