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 だけでなく) 任意のプロパティ タイプに使用できます。私の解決策がより明確になったことを願っています。