Devexpress XAF类属性数据源筛选

Devexpress XAF类属性数据源筛选,devexpress,xaf,xpo,Devexpress,Xaf,Xpo,我声明了一个类似这样的类 [DefaultClassOptions] public class Test:XPObject { Type _classType; [NonPersistent] public Type ClassType { get { return _classType; } set { SetPropertyValue("ClassType", ref _classType, value); } }

我声明了一个类似这样的类

[DefaultClassOptions]
public class Test:XPObject
{
    Type _classType;

    [NonPersistent]
    public Type ClassType
    {
         get { return _classType; }
         set { SetPropertyValue("ClassType", ref _classType, value); }
    }
}
问题是,此字段显示为下拉列表,但我无法控制此列表,无法筛选或自定义此列表。它总是在所有程序集中打开所有可访问的类型。DataSourceProperty和DataSourceCriteria属性都不起作用

我可以用其他持久类来实现这一点,但不能用“类型”类型的字段


如果有解决方法,请提供帮助。提前感谢。

实现本地化的ClassInfoTypeConverter子代,如下所示:

public class LocalizedClassInfoTypeConverter<T> : LocalizedClassInfoTypeConverter {
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) {
            List<Type> list = new List<Type>();
            foreach (Type t in base.GetStandardValues(context)) {
                if (typeof(T).IsAssignableFrom(t)) list.Add(t);
            }
            return new StandardValuesCollection(list);
        }
    }
公共类LocalizedClassInfoTypeConverter:LocalizedClassInfoTypeConverter{
公共覆盖标准值集合GetStandardValues(ITypeDescriptor上下文){
列表=新列表();
foreach(在base.GetStandardValues(上下文)中键入t){
if(typeof(T).IsAssignableFrom(T))list.Add(T);
}
返回新的标准值集合(列表);
}
}
然后按如下方式使用:

[DefaultClassOptions]
public class Test:XPObject
{
    Type _classType;
    [ValueConverter(typeof(TypeToStringConverter))]
    [TypeConverter(typeof(LocalizedClassInfoTypeConverter<MyBaseTypeOrInterface>))]
    public Type ClassType
    {
         get { return _classType; }
         set { SetPropertyValue("ClassType", ref _classType, value); }
    }
[DefaultClassOptions]
公共类测试:XPObject
{
类型_classType;
[ValueConverter(typeof(TypeToString转换器))]
[TypeConverter(typeof(LocalizedClassInfoTypeConverter))]
公共类型类类型
{
获取{return\u classType;}
set{SetPropertyValue(“ClassType”,ref _ClassType,value);}
}
}

资料来源:

根据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.Collections.Generic;
使用System.Linq;
使用DevExpress.ExpressApp.DC;
使用DevExpress.Persistent.Base;
使用DevExpress.Persistent.BaseImpl;
使用DevExpress.Xpo;
命名空间SimpleProjectManager.Module.BusinessObjects{
[域组件]
公共类非持久性TypeWrapper{
公共字符串全名{get;set;}
}
[DefaultClassOptions]
公共类PersistentTestObject:BaseObject{
公共PersistentTestObject(会话):基(会话){}
[持久性(“StringColumnNameInDb”)]
私有字符串StringFieldThoSevValuesStoredinDB;
私有非持久性TypeWrapper\u TypeProperty;
[非持久性,数据源属性(“TypesDataSource”)]
公共非持久性TypeWrapper TypeProperty{
得到{
if(_TypeProperty==null&&!string.IsNullOrEmpty(stringFieldThoseValueIsStoredInDb)){
_TypeProperty=TypesDataSource.Single(v=>v.FullName==StringFieldThoseValuesStoredInDB);
}
返回类型属性;
}
设置{
SetPropertyValue(“TypeProperty”,ref _TypeProperty,value);
如果(!IsLoading&&!IsSaveing){
stringFieldThoseValueIsStoredInDb=value!=null?value.FullName:string.Empty;
一旦更改(“StringFieldThoSevValuesStoredinDB”);
}
}
}
私有列表_TypesDataSource=null;
受保护的IList类型数据源{
得到{
if(_TypesDataSource==null){
_TypesDataSource=新列表();
foreach(System.Reflection.Assembly.GetExecutionGassembly().GetTypes()中的类型){
如果(type.FullName.Contains(“Planning”){//一些基本筛选。。。
_添加(新的非持久性TypeWrapper(){FullName=type.FullName});
}
}
}
返回_TypesDataSource;
}
}
}
}
结果是:
虽然这看起来有点复杂,但这种方法是通用的,当您需要通过非持久性属性更新持久性属性时,它可以用于任何属性类型(不仅仅是System.type)。我希望我的解决方案现在更清晰。

不清楚您需要实现什么。了解你的目标可以帮助你找到合适的解决方案。顺便说一句,XPO中的持久类是用来描述数据库模式的。您可能选择了错误的方法来实现某个功能。实际上,这是一个非持久性属性,它将给定类型转换为字符串并映射到表中的字符串字段。当然,thx为此,我需要编辑我的问题,但主要问题是根据标准或自定义筛选方法筛选下拉列表项,我无法实现这一点,需要帮助。thx对于您的示例很好,但它没有帮助。我已经编辑了我的问题,这是一个映射到字符串字段的非持久属性。我不想为了简单而给出转换的细节。@Onur,我已经更新了以前的答案,以便更好地描述建议的解决方案。我希望这能有所帮助。你就是那个人,谢谢你的回答,看起来很有用,我会立即尝试。嗨,你的解决方案完美无瑕,非常感谢@Erikwitkowski我很高兴我能有用;)