XAF之点击Navigation Control弹出新建对象窗口

翻译 2012年03月30日 20:30:38

           当单击navigation control的item时,执行New(NewObjectViewController.NewObjectAction)按钮。


     先新建一个DemoIssue持久类,略。

     再利用model设计器添加一个navigation item: Create New...,并设置其View属性为DemoIssue_ListView


         此时,单击CreateNewIssue默认显示是DemoIssue_ListView。但我们想将视图改为新建DemoIssue对象的DetailView,所以,需要重写ShowNavigationItemControllerShowNavigationItem方法。该方法会在ShowNavigationItemController.ShowNavigationItemActionSingleChoiceAction.Execute事件中调用。

     额外的细节:

     要运行NewObjectViewController.NewObjectAction,需要调用它的SingleChoiceAction.DoExecute方法。传递一个ChoiceActionItem参数给该方法并不是必须的,因为它只是提供随后执行操作事件信息。然而,你也可以创建需要的ChoiceActionItem并传递。

    要访问NewObjectAction,需要得到包含它的NewObjectViewController。获得该Controller的方法是GetController<Controller>。不推荐使用当前Window(Frame)来调用该方法,这是因为我们要修改Window的行为。所以,要创建一个分离的Frame并利用它获取NewObjectViewController。注意,frame必须包含一个View。包含的方法是Fame.SetView

public class CreateNewObjectFromNavigationController : ShowNavigationItemController
    {
        private NewObjectViewController newController;
        private DetailView createdDetailView;
        private const string CreateNewObjectItemId = "CreateNewIssue";
        private const string CreateNewObjectNavigationItemActiveKey = "CreationAllowed";
        private const string CreateNewObjectNavigationItemDefaultPath =
        "Issues/" + CreateNewObjectItemId;
        public CreateNewObjectFromNavigationController()
        {
            TargetWindowType = WindowType.Main;
        }
        protected override void ShowNavigationItem(SingleChoiceActionExecuteEventArgs e)
        {
            //从SingleChoiceActionExecuteEventArgs也可以获得NavigationItem
            if ((e.SelectedChoiceActionItem != null)
            && e.SelectedChoiceActionItem.Enabled.ResultValue
            && e.SelectedChoiceActionItem.Id == CreateNewObjectItemId)
            {
                Frame workFrame = Application.CreateFrame(TemplateContext.ApplicationWindow);
                workFrame.SetView(Application.CreateListView(
                Application.CreateObjectSpace(), typeof(DemoIssue), true));
                newController = workFrame.GetController<NewObjectViewController>();
                if (newController != null)
                {
                    ChoiceActionItem newObjectItem = FindNewObjectItem();
                    if (newObjectItem != null)
                    {
                        //代码中调用"New"按钮
                        newController.NewObjectAction.Executed += NewObjectAction_Executed;
                        newController.NewObjectAction.DoExecute(newObjectItem);
                        //newController.NewObjectAction.DoExecute(null);
                        newController.NewObjectAction.Executed -= NewObjectAction_Executed;
                        e.ShowViewParameters.TargetWindow = TargetWindow.Default;
                        e.ShowViewParameters.CreatedView = createdDetailView;
                        //Cancel the default processing for this navigation item.
                        return;
                    }
                }
            }
            //Continue the default processing for other navigation items.
            base.ShowNavigationItem(e);
        }
        private ChoiceActionItem FindNewObjectItem()
        {
            foreach (ChoiceActionItem item in newController.NewObjectAction.Items)
                if (item.Data == typeof(DemoIssue))
                    return item;
            return null;
        }
        //这里没有用到sender,故前面newController.NewObjectAction.DoExecute(newObjectItem)
        //传递ChoiceActionItem参数不是必须的
        private void NewObjectAction_Executed(object sender, ActionBaseEventArgs e)
        {
            createdDetailView = e.ShowViewParameters.CreatedView as DetailView;
            //Cancel showing the default View by the NewObjectAction
            e.ShowViewParameters.CreatedView = null;
        }

        protected override void InitializeItems()
        {
            base.InitializeItems();
            ChoiceActionItem newNavigationItem = FindNewNavigationItem();
            if (newNavigationItem != null)
                newNavigationItem.Active[CreateNewObjectNavigationItemActiveKey] =
                SecuritySystem.IsGranted(new ObjectAccessPermission(
                typeof(DemoIssue), ObjectAccess.Create));
        }
        //获取NavigationItem的方法
        private ChoiceActionItem FindNewNavigationItem()
        {
            return ShowNavigationItemAction.FindItemByIdPath(CreateNewObjectNavigationItemDefaultPath);
        }
    }
  从这里例子我们可以学到如下几点:

1.如何获取Navigation Item

2.如何改变Navigation Item的默认行为

3.代码中执行New按钮


另外,若要在运行时创建Navigation Item,可以不必重写ShowNavigationItemController。继承WindowController在OnFrameAssigned方法中可以获取ShowNavigationController,并且订阅其NavigationItemCreated事件即可。下面是示例代码:作用是为每个Bussiness Class添加一个说明的子项。

public partial class TaskBasedHelpController : WindowController
    {
        public TaskBasedHelpController()
        {
            InitializeComponent();
            RegisterActions(components);
            this.TargetWindowType = WindowType.Main;
        }
        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);
        }
        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);
                //Console.WriteLine(objectTypeInfo.Name);
                if (objectTypeInfo != null)
                {
                    CriteriaOperator docCriteria =
                    CriteriaOperator.Parse("ObjectType == ?", objectTypeInfo.Type);
                    IObjectSpace myObjectSpace = Application.CreateObjectSpace();
                    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, "HelpDocument_DetailView_FewColumns");
                            ChoiceActionItem docItem = new ChoiceActionItem(
                            doc.Oid.ToString(), doc.Title, shortcut) { ImageName = "Navigation_Item_Report" };
                            docsGroup.Items.Add(docItem);
                        }
                    }
                }
            }
        }
    }



XAF应用开发教程(一) 创建项目

XAF是DevExpress公司的快速开发框架,全称eXpress Application Framework,是企业信息系统的开发利器,快速开发效果显著,在.net框架中,笔者至今没有找到一款可以与...
  • feigamesnb
  • feigamesnb
  • 2015年12月24日 08:06
  • 777

XAF框架简介-C#语言

1 XAF的适用范围: These are the applications described at the beginning of this overview - those design...
  • ejinxian
  • ejinxian
  • 2014年11月18日 19:11
  • 829

前端弹出框组件

下面分享一个js 弹出窗, 分 toast , dialog , load 三种弹窗 , 下面用js css 来实现以下:首先是js代码 | 采用了 es6 的写法 //公共弹窗加载动画const...
  • java_goodstudy
  • java_goodstudy
  • 2016年12月17日 16:06
  • 835

angularJs页面弹框的实现

弹框需要三样东西,点击发生弹框事件的按钮,弹框页面,js逻辑。 下面用一个实例解释: 1,按钮:按钮的点击事件为toSendEmail()...
  • xiaoyuer666999
  • xiaoyuer666999
  • 2017年05月09日 09:37
  • 1080

Easyui弹出框

Index视图 @{ Layout = null; } DataGrid的使用示例 ...
  • Fanbin168
  • Fanbin168
  • 2016年01月06日 20:05
  • 2810

使用jQuery实现弹出框效果

一,背景 由于在项目中需要用到的一个页面效果是弹出框,在项目中我使用jquery的ui插件,来实现这个功能,用法也比较简单 二,准备环境 1)引入jquery插件。 在index.ht...
  • smart_seed
  • smart_seed
  • 2016年11月28日 18:38
  • 4978

JS学习--常见弹出框

小编最近做项目发现JS调试的时候出现很多的问题,在写JS的时候很多的基础知识都不是很清晰了,所以最近会总结一些JS常见的基础知识,算是对自己JS的一个回顾吧!今天我主要是总结了一下常见的弹出框-普通弹...
  • wangdan1030
  • wangdan1030
  • 2016年02月01日 23:19
  • 741

bootstrap提示和弹出框

一、提示效果。 提示 body { padding: 200px; } $(function (){ $("a").tooltip(); //初始化 }...
  • u013126379
  • u013126379
  • 2016年10月30日 12:23
  • 5349

IOS 自定义从底部弹上来的View

效果图: //从底部向上弹起的UIView类源码 #import "TFSheetView.h" @interface TFSheetView() { UIView *_contentV...
  • robinson_911
  • robinson_911
  • 2016年06月22日 19:36
  • 8089

XAF应用开发教程(六)控制器

转载自:http://www.cnblogs.com/foreachlife/p/xafviewcontrollerAndValidationContext.html 是的,XAF也是MVC...
  • feigamesnb
  • feigamesnb
  • 2015年12月24日 08:17
  • 1088
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XAF之点击Navigation Control弹出新建对象窗口
举报原因:
原因补充:

(最多只允许输入30个字)