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

但是,我怀疑这不是您需要的功能。修改属性的值不会改变记录的基本类型。也就是说,您最终会BaseEvent得到一个属性Type等于“音乐会”或“电影”的类型的记录。

XAF 已经提供了一种机制来选择要创建的记录类型。在您的场景中,您会发现该New按钮是一个下拉菜单,其中包含不同的子类作为选项:

在此处输入图像描述

因此,您不需要在对象中创建“类型”属性。如果你需要一个列来在列表视图中显示事件的类型,你可以声明一个属性如下

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