2

私はこのようなクラスを宣言しました

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

    [NonPersistent]
    public Type ClassType
    {
         get { return _classType; }
         set { SetPropertyValue("ClassType", ref _classType, value); }
    }
}

問題は、このフィールドがドロップダウン リストとして表示されることですが、このリストを制御できないため、このリストをフィルター処理したりカスタマイズしたりできません。すべてのアセンブリ内のすべてのアクセス可能な型で常に開きます。DataSourceProperty 属性も DataSourceCriteria 属性も機能しませんでした。

私は他の永続クラスでこれを行うことができますが、「タイプ」型付きフィールドではできません。

回避策があれば助けてください。前もって感謝します。

4

2 に答える 2

3

LocalizedClassInfoTypeConverter の子孫を次のように実装します。

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);
        }
    }

次に、次のように使用します。

[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); }
    }

}

ソース: https://www.devexpress.com/Support/Center/Question/Details/Q364986

于 2014-07-23T20:32:18.623 に答える
2

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

于 2014-07-29T08:36:16.860 に答える