0

と呼ばれる基本クラスBaseEventといくつかの子孫クラスがあります。

public class BaseEvent {
    // the some properties
    // ...
}

[MapInheritance(MapInheritanceType.ParentTable)]
public class Film : BaseEvent {
   // the some properties
   // ...
}
[MapInheritance(MapInheritanceType.ParentTable)]
public class Concert : BaseEvent {
    // the some properties
    // ...
}

BaseEvent実行時にインスタンスを作成するコードがあります:

BaseEvent event = new BaseEvent();
// assign values for a properties
// ...    
baseEvent.XPObjectType = Database.XPObjectTypes.SingleOrDefault(
    t => t.TypeName == "MyApp.Module.BO.Events.BaseEvent");

これで、このイベントがBaseEventリスト ビューで表示されます。

私は次のことをしたい: ユーザーがEditボタンをクリックすると、すべての子孫の種類を含むリスト ビューのルックアップ フィールドに表示されます。そして、ユーザーがレコードの変更ObjectTypeを選択した値に保存すると。

これどうやってするの?
ありがとう。

PS。これはasp.netアプリです。

4

1 に答える 1

5

あなたのアプローチがあなたが達成しようとしていることに対して正しいかどうかはわかりません。最初に、あなたが尋ねた質問に答えてから、あなたが達成しようとしている機能を XAF がすでにどのように提供しているか、つまりユーザー インターフェイスから作成するレコードのサブクラスを選択する方法を説明しようと思います。

Typeユーザーがアプリケーション内でを選択できるようにするプロパティを作成するために、TypeConverter を宣言できます。

public class EventClassInfoTypeConverter : LocalizedClassInfoTypeConverter
{
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        List<Type> values = new List<Type>();
        foreach (ITypeInfo info in XafTypesInfo.Instance.PersistentTypes)
        {
            if ((info.IsVisible && info.IsPersistent) && (info.Type != null))
            {
                // select BaseEvent subclasses
                if (info.Type.IsSubclassOf(typeof(BaseEvent))) 
                    values.Add(info.Type);
            }
        }
        values.Sort(this);
        values.Insert(0, null);
        return new TypeConverter.StandardValuesCollection(values);
    }
}

そして、基本イベント クラスは次のようになります。

public class BaseEvent: XPObject
{
    public BaseEvent(Session session)
        : base(session)
    { }

    private Type _EventType;
    [TypeConverter(typeof(EventClassInfoTypeConverter))]
    public Type EventType
    {
        get
        {
            return _EventType;
        }
        set
        {
            SetPropertyValue("EventType", ref _EventType, value);
        }
    }
}

ただし、これは必要な機能ではないと思います。プロパティの値を変更しても、レコードのベース タイプは変更されません。つまり、'Concert' または 'Film' に等しいBaseEventプロパティを持つタイプのレコードになります。Type

XAF は、作成するレコードのタイプを選択するためのメカニズムをすでに提供しています。あなたのシナリオでは、Newボタンがさまざまなサブクラスをオプションとして持つドロップダウンであることがわかります。

ここに画像の説明を入力

したがって、オブジェクト内に「type」プロパティを作成する必要はありません。リスト ビューでイベントの種類を表示する列が必要な場合は、次のようにプロパティを宣言できます。

[PersistentAlias("XPObjectType.Name")]
public string EventType
{
    get
    {
        return base.ClassInfo.ClassType.Name;
    }
}
于 2012-04-16T15:21:33.097 に答える