我有一个名为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 app。
答案 0 :(得分: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
等于'Concert'或'Film'。
XAF已经提供了一种机制来选择要创建的记录类型。在您的场景中,您会发现 New 按钮是一个下拉列表,其中包含不同的子类作为选项:
因此,您无需在对象中创建“type”属性。如果需要列在列表视图中显示事件类型,则可以按如下方式声明属性
[PersistentAlias("XPObjectType.Name")]
public string EventType
{
get
{
return base.ClassInfo.ClassType.Name;
}
}