EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:实现自定义上下文导航

导航系统支持上下文导航。您可以在导航控件中跟踪创建导航项的过程,并添加自定义导航项。本主题演示了如何在应用程序中实现自定义上下文导航。将实现一个窗口控制器。该控制器将添加“基于任务的帮助”子导航项目,每个子导航项目都将包含调用详细视图的项目,这些视图显示了各种帮助文档。

ContextNavigationCustomHowTo

注意

移动应用程序不支持动态创建导航项,因此本主题中描述的方法无法在Mobile平台中实现。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E1843)中提供了完整的示例项目。

要实现示例自定义上下文导航,请执行以下步骤。

  1. 定义HelpDocument业务类。这是代表帮助文档的类。
  2. 实现自定义窗口控制器。它将包含自定义上下文导航逻辑,该逻辑将处理ShowNavigationItemController.NavigationItemCreated。事件处理程序必须创建一个名为“基于任务的帮助”的子导航项,其相应的子节点指向适当的帮助文档。请注意,每个帮助文档都将与特定的业务类别相关联。创建的导航项可以指向没有关联文档的业务类的视图。在这种情况下,不应创建“基于任务的帮助”导航项。

定义HelpDocument业务类

HelpDocument业务类是由三个属性。

  • 标题-代表文件的标题。
  • 文本-保存文档中包含的实际文本。帮助文档的文本可能会很长,因此应使用Size [-1]属性修饰此属性(请参见数据模型中的数据注释)。
  • ObjectType-每个文档将与一个业务类相关联。因此,只会显示与特定业务类别相关的帮助主题。在对象类型属性保持相关业务类的类型。由于此属性是Type类型的,因此必须实现一个自定义值转换器(请参阅ValueConverter),以将该属性正确存储在数据库中。
using DevExpress.ExpressApp.Utils;
//...
[DefaultClassOptions, ImageName("BO_Report")]
public class HelpDocument : BaseObject {
    public HelpDocument(Session session) : base(session) { }
    [DevExpress.Xpo.ValueConverter(typeof(TypeToStringConverter ))]
    public Type ObjectType {
        get { return GetPropertyValue<Type>(nameof(ObjectType)); }
        set { SetPropertyValue<Type>(nameof(ObjectType), value); }
    }
    public string Title {
        get { return GetPropertyValue<string>(nameof(Title)); }
        set { SetPropertyValue<string>(nameof(Title), value); }
    }
    [Size(-1)]
    public string Text {
        get { return GetPropertyValue<string>(nameof(Text)); }
        set { SetPropertyValue<string>(nameof(Text), value); }
    }
}

实现自定义窗口控制器

自定义控制器必须只针对主激活窗口,因为只有主窗口模板包含导航行动集装箱(见导航系统)。要实现自定义上下文导航逻辑,请订阅ShowNavigationItemControllerNavigationItemCreated事件。不要忘记取消订阅该事件,以防止内存泄漏。

using DevExpress.ExpressApp.SystemModule;
//...
public class TaskBasedHelpController : WindowController {
    private ShowNavigationItemController navigationController;
    protected override void OnFrameAssigned() {
        UnsubscribeFromEvents();
        base.OnFrameAssigned();
        navigationController =
            Frame.GetController<ShowNavigationItemController>();
        if(navigationController != null) {
            navigationController.NavigationItemCreated  = 
                navigationItemCreated;
        }
    }
    private void UnsubscribeFromEvents() {
        if(navigationController != null) {
            navigationController.NavigationItemCreated -= 
                navigationItemCreated;
            navigationController = null;
        }
    }
    protected override void Dispose(bool disposing) {
        UnsubscribeFromEvents();
        base.Dispose(disposing);
    }
}

处理NavigationItemCreated事件

NavigationItemCreated导航项目已在导航控制被创建之后发生的事件。您将需要跟踪事件处理程序中导航项的创建。由于并非每个导航项都指向一个视图,因此请检查是否设置了特定的NavigationItem节点的View属性。如果是,请检查是否存在特定业务类的帮助文档。如果存在现有帮助文档,请创建“基于任务的帮助”子导航项,并在其中填充与这些现有帮助文档相对应的子节点。另外,通过模型编辑器创建只读的HelpDocument_DetailView_FewColumns细节视图。该视图将用于显示帮助文档。

using System.Collections.Generic;
using DevExpress.Data.Filtering;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.ExpressApp.DC;
using DevExpress.ExpressApp.Model;
//...
public class TaskBasedHelpController : WindowController {
    //...
    void navigationItemCreated(object sender, NavigationItemCreatedEventArgs e) {
        ChoiceActionItem navigationItem = e.NavigationItem;
        IModelObjectView viewNode = ((IModelNavigationItem)e.NavigationItem.Model).View as 
            IModelObjectView;
        if (viewNode != null) {
            ITypeInfo objectTypeInfo = XafTypesInfo.Instance.FindTypeInfo(viewNode.ModelClass.Name);
            if (objectTypeInfo != null) {
                CriteriaOperator docCriteria = 
                    CriteriaOperator.Parse("ObjectType == ?", objectTypeInfo.Type);
                IObjectSpace myObjectSpace = Application.CreateObjectSpace(typeof(HelpDocument));
                IList<HelpDocument> docs = myObjectSpace.GetObjects<HelpDocument>(docCriteria);
                if (docs.Count > 0) {
                    ChoiceActionItem docsGroup = new ChoiceActionItem(
                        "CustomDocuments", "Task-Based Help", null) { ImageName = "BO_Report" };
                    navigationItem.Items.Add(docsGroup);
                    foreach (HelpDocument doc in docs) {
                        ViewShortcut shortcut = new ViewShortcut(typeof(HelpDocument), 
                            doc.Oid.ToString(), "HelpDocument_DetailView_FewColumns");
                        ChoiceActionItem docItem = new ChoiceActionItem(
                            doc.Oid.ToString(), doc.Title, shortcut) 
                            { ImageName = "Navigation_Item_Report" };
                        docsGroup.Items.Add(docItem);
                    }
                }
            }
        }
    }
}
相关文章

转载保留此链接,注明出处