一、要将FeatureCenter的动态库FeatureCenter.Module.dll引入到你的应用程序中
二、 在需要直接加载DetailView类前加入:
[AutoCreatableObject(ViewEditMode = ViewEditMode.View)]
表明此类是要直接加载DetailView的
这个比较灵活,比帮助中的简单,方便,如:
[NonPersistent]
[DefaultClassOptions][AutoCreatableObject(ViewEditMode = ViewEditMode.View)]
public class DomainObject1
{
public string Title { get; set; }
public string Context { get; set; }
private static DomainObject1 instance;
protected DomainObject1() : base() {}
public static DomainObject1 Instance
{
get
{
if(instance == null) {
instance = new DomainObject1();
}
return instance;
}
}
}
}
三、修改你的Module.cs
public sealed partial class FeatureCenterTestModule : ModuleBase
{
public FeatureCenterTestModule()
{
DevExpress.ExpressApp.ConditionalEditorState.Core.EditorStateRuleManager.CustomParseProperties += EditorStateRuleManager_CustomParseProperties;
Disposed += FeatureCenterTestModule_Disposed;
InitializeComponent();
DateRangeRepository.RegisterRange(new DateRange("Rolling 1994", new RangePoint(new DateTime(1994, 1, 1), 0, TimeIntervalType.Day), new RangePoint(new DateTime(1994, 1, 1), DateTime.Today.DayOfYear, TimeIntervalType.Day)));
DateRangeRepository.RegisterRange(new DateRange("Rolling 1995", new RangePoint(new DateTime(1995, 1, 1), 0, TimeIntervalType.Day), new RangePoint(new DateTime(1995, 1, 1), DateTime.Today.DayOfYear, TimeIntervalType.Day)));
DateRangeRepository.RegisterRange(new DateRange("Rolling 1996", new RangePoint(new DateTime(1996, 1, 1), 0, TimeIntervalType.Day), new RangePoint(new DateTime(1996, 1, 1), DateTime.Today.DayOfYear, TimeIntervalType.Day)));
Hints.RegisterViewSpecificHints();
}
private void Application_CustomizeFormattingCulture(object sender, CustomizeFormattingCultureEventArgs e) {
e.FormattingCulture.NumberFormat.CurrencySymbol = System.Globalization.CultureInfo.GetCultureInfo("en-US").NumberFormat.CurrencySymbol;
}
private void application_CustomProcessShortcut(object sender, CustomProcessShortcutEventArgs e) {
if (e.Shortcut != null && !string.IsNullOrEmpty(e.Shortcut.ViewId)) {
IModelView modelView = Application.FindModelView(e.Shortcut.ViewId);
if(modelView is IModelObjectView) {
ITypeInfo typeInfo = ((IModelObjectView)modelView).ModelClass.TypeInfo;
AutoCreatableObjectAttribute attribute = typeInfo.FindAttribute<AutoCreatableObjectAttribute>(true);
if(attribute != null && attribute.AutoCreatable) {
IObjectSpace objSpace = Application.CreateObjectSpace();
object obj;
if(typeof(XPBaseObject).IsAssignableFrom(typeInfo.Type)) {
obj = objSpace.FindObject(typeInfo.Type, null);
if(obj == null) {
obj = objSpace.CreateObject(typeInfo.Type);
}
}
else {
if (typeInfo.Type == typeof(DomainObject1))
{
obj = DomainObject1.Instance;
} else {
obj = Activator.CreateInstance(typeInfo.Type);
}
}
//obj = typeof(BaseObject).IsAssignableFrom(typeInfo.Type) ? objSpace.CreateObject(typeInfo.Type) : Activator.CreateInstance(typeInfo.Type);
DetailView detailView = Application.CreateDetailView(objSpace, obj, true);
if(attribute.ViewEditMode == ViewEditMode.Edit) {
detailView.ViewEditMode = DevExpress.ExpressApp.Editors.ViewEditMode.Edit;
}
e.View = detailView;
e.Handled = true;
}
}
}
}
private void AuditTrailServiceInstance_QueryCurrentUserName(object sender, QueryCurrentUserNameEventArgs e) {
//Do not remove this line. Usually, the current user name is supplied by an XAF application's Security System.
//However, the FeatureCenter demo doesn't use the Security System module.
//That's why we have to use the WindowsIdentity, to get the current user name.
e.CurrentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
}
private void AuditTrailServiceInstance_CustomizeAuditTrailSettings(object sender, CustomizeAuditTrailSettingsEventArgs e) {
e.AuditTrailSettings.Clear();
e.AuditTrailSettings.AddType(typeof(FeatureCenter.Module.Audit.SimplePropertiesAuditedObject), true);
e.AuditTrailSettings.AddType(typeof(FeatureCenter.Module.Audit.CollectionPropertiesAuditedObject), true);
e.AuditTrailSettings.AddType(typeof(FeatureCenter.Module.Audit.AuditSettingsObject), new string[] { "Name", "AuditedProperty" });
e.AuditTrailSettings.AddType(typeof(FeatureCenter.Module.Audit.ObjectAuditingModesObject), true);
}
private void FeatureCenterTestModule_Disposed(object sender, EventArgs e)
{
DevExpress.ExpressApp.ConditionalEditorState.Core.EditorStateRuleManager.CustomParseProperties -= EditorStateRuleManager_CustomParseProperties;
}
private void EditorStateRuleManager_CustomParseProperties(object sender, DevExpress.ExpressApp.ConditionalEditorState.Core.CustomParsePropertiesEventArgs e) {
if (e.TypeInfo.Type == typeof(FeatureCenter.Module.ConditionalEditorState.HideShowEditorsObject)) {
e.Handled = true;
}
}
private void CustomizeAppearanceDemoObject(ITypeInfo ti) {
if(ti != null) {
IMemberInfo mi1 = ti.FindMember("HideSimpleLayoutItem");
if(mi1 == null) {
mi1 = ti.CreateMember("HideSimpleLayoutItem", typeof(bool));
mi1.AddAttribute(new ImmediatePostDataAttribute());
mi1.AddAttribute(new VisibleInListViewAttribute(false));
mi1.AddAttribute(new VisibleInLookupListViewAttribute(false));
}
IMemberInfo mi2 = ti.FindMember("HideSimpleLayoutGroup");
if(mi2 == null) {
mi2 = ti.CreateMember("HideSimpleLayoutGroup", typeof(bool));
mi2.AddAttribute(new ImmediatePostDataAttribute());
mi2.AddAttribute(new VisibleInListViewAttribute(false));
mi2.AddAttribute(new VisibleInLookupListViewAttribute(false));
}
IMemberInfo mi3 = ti.FindMember("HideTabPageGroup");
if(mi3 == null) {
mi3 = ti.CreateMember("HideTabPageGroup", typeof(bool));
mi3.AddAttribute(new ImmediatePostDataAttribute());
mi3.AddAttribute(new VisibleInListViewAttribute(false));
mi3.AddAttribute(new VisibleInLookupListViewAttribute(false));
}
}
}
protected override BusinessClassesList GetBusinessClassesCore() {
BusinessClassesList classesList = base.GetBusinessClassesCore();
classesList.Add(typeof(OidGenerator));
return classesList;
}
protected override void CustomizeModelApplicationCreatorProperties(ModelApplicationCreatorProperties creatorProperties) {
base.CustomizeModelApplicationCreatorProperties(creatorProperties);
creatorProperties.RegisterObject(
typeof(DevExpress.ExpressApp.Validation.IModelRuleBase),
typeof(FeatureCenter.Module.Validation.RuleStringLengthComparison),
typeof(FeatureCenter.Module.Validation.IRuleStringLengthComparisonProperties));
creatorProperties.RegisterObject(
typeof(DevExpress.ExpressApp.Validation.IModelRuleBase),
typeof(FeatureCenter.Module.Validation.CodeRuleObjectIsValidRule),
typeof(DevExpress.Persistent.Validation.IRuleBaseProperties));
}
protected override ModuleTypeList GetRequiredModuleTypesCore() {
ModuleTypeList moduleTypeList = base.GetRequiredModuleTypesCore();
moduleTypeList.Add(typeof(DevExpress.ExpressApp.ConditionalAppearance.ConditionalAppearanceModule));
moduleTypeList.Add(typeof(DevExpress.ExpressApp.SystemModule.SystemModule));
return moduleTypeList;
}
public override void AddGeneratorUpdaters(ModelNodesGeneratorUpdaters updaters) {
base.AddGeneratorUpdaters(updaters);
updaters.Add(new ModelImageSourcesUpdater());
updaters.Add(new ConditionalEditorStateNodesGeneratorUpdater());
updaters.Add(new CustomDetailViewItemsGenarator());
updaters.Add(new CustomDetailViewLayoutGenarator());
}
public override void Setup(XafApplication application) {
base.Setup(application);
if (!XafTypesInfo.IsInitialized) {
XafTypesInfo.Instance.AddEntityToGenerate("DcNamedBaseObject", typeof(IDcNamedBaseObject));
XafTypesInfo.Instance.AddEntityToGenerate("DcDisableEnableEditorsObject", typeof(IDcDisableEnableEditorsObject));
XafTypesInfo.Instance.AddEntityToGenerate("DcDisableEnableEditorsAggregatedObject", typeof(IDcDisableEnableEditorsAggregatedObject));
XafTypesInfo.Instance.AddEntityToGenerate("DcDisableEnableEditorsLookupObject", typeof(IDcDisableEnableEditorsLookupObject));
XafTypesInfo.Instance.AddEntityToGenerate("DcDisableEnableEditorsCollectionElementObject", typeof(IDcDisableEnableEditorsCollectionElementObject));
}
Application.CustomizeFormattingCulture += new EventHandler<CustomizeFormattingCultureEventArgs>(Application_CustomizeFormattingCulture);
application.CustomProcessShortcut += new EventHandler<CustomProcessShortcutEventArgs>(application_CustomProcessShortcut);
AuditTrailService.Instance.TimestampStrategy = new LocalAuditTimestampStrategy();
AuditTrailService.Instance.QueryCurrentUserName += new QueryCurrentUserNameEventHandler(AuditTrailServiceInstance_QueryCurrentUserName);
AuditTrailService.Instance.CustomizeAuditTrailSettings += new CustomizeAuditSettingsEventHandler(AuditTrailServiceInstance_CustomizeAuditTrailSettings);
//((ViewVariantsModule)application.Modules.FindModule(typeof(ViewVariantsModule))).GenerateVariantsNode = false;
}
public override void CustomizeTypesInfo(ITypesInfo typesInfo) {
base.CustomizeTypesInfo(typesInfo);
CustomizeAppearanceDemoObject(typesInfo.FindTypeInfo(typeof(FeatureCenter.Module.ConditionalEditorState.HideShowEditorsObject)));
CustomizeAppearanceDemoObject(typesInfo.FindTypeInfo(typeof(FeatureCenter.Module.ConditionalAppearance.ConditionalAppearanceHideShowEditorsObject)));
}
public override void ExtendModelInterfaces(ModelInterfaceExtenders extenders) {
base.ExtendModelInterfaces(extenders);
extenders.Add<IModelMember, IModelClassMemberExtender>();
extenders.Add<IModelPropertyEditor, IModelPropertyEditorClassMemberExtender>();
extenders.Add<IModelLayoutGroup, IModelLayoutGroupExtender>();
extenders.Add<IModelView, IModelViewDemoDescription>();
}
}
public class ModelImageSourcesUpdater : ModelNodesGeneratorUpdater<ImageSourceNodesGenerator> {
public override void UpdateNode(ModelNode node) {
//IModelAssemblyResourceImageSource customImages = (IModelAssemblyResourceImageSource)node[CustomImages.CustomImagesAssemblyInfo.AssemblyName];
//if(customImages == null) {
// customImages = node.AddNode<IModelAssemblyResourceImageSource>(CustomImages.CustomImagesAssemblyInfo.AssemblyName);
// customImages.Index = node.NodeCount - 1;
//}
//customImages.Folder = "Images";
}
}
public class ConditionalEditorStateNodesGeneratorUpdater : ModelNodesGeneratorUpdater<ConditionalEditorStateNodesGenerator> {
public override void UpdateNode(ModelNode node) {
ITypeInfo ti = XafTypesInfo.Instance.FindTypeInfo(typeof(FeatureCenter.Module.ConditionalEditorState.HideShowEditorsObject));
if(ti != null) {
IModelEditorStateRule hideSimpleLayoutItem = node.AddNode<IModelEditorStateRule>("HideShowEditorsObject.HideSimpleLayoutItem ID");
hideSimpleLayoutItem.ModelClass = node.Application.BOModel[ti.FullName];
hideSimpleLayoutItem.Attribute = new EditorStateRuleAttribute("HideShowEditorsObject.HideSimpleLayoutItem ID", "SimpleLayoutItem", EditorState.Hidden, "HideSimpleLayoutItem = 'True'", ViewType.DetailView);
IModelEditorStateRule hideSimpleLayoutGroup = node.AddNode<IModelEditorStateRule>("HideShowEditorsObject.HideSimpleLayoutGroup ID");
hideSimpleLayoutGroup.ModelClass = node.Application.BOModel[ti.FullName];
hideSimpleLayoutGroup.Attribute = new EditorStateRuleAttribute("HideShowEditorsObject.HideSimpleLayoutGroup ID", "SimpleLayoutGroup", EditorState.Hidden, "HideSimpleLayoutGroup = 'True'", ViewType.DetailView);
IModelEditorStateRule hideTabPageGroup = node.AddNode<IModelEditorStateRule>("HideShowEditorsObject.HideTabPageGroup ID");
hideTabPageGroup.ModelClass = node.Application.BOModel[ti.FullName];
hideTabPageGroup.Attribute = new EditorStateRuleAttribute("HideShowEditorsObject.HideTabPageGroup ID", "TabPageGroup", EditorState.Hidden, "HideTabPageGroup = 'True'", ViewType.DetailView);
}
}
}
这样你就可以直接使用DetailView