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

03.02.03.01 Add an Item to the Navigation Control 向导航控件添加项 摘要:本教程演示如何在XAF框架中向导航控件添加Notes项。通过模型编辑器修改Model.DesignedDiffs.xafml文件,在NavigationItems节点下添加新的NavigationItem,并设置其View属性为Note_ListView、Caption为"Notes"、Id为"Note"。添加完成后,运行应用程序即可在导航控件中看到Notes项,点击将显示Note实体类的列表视图。该过程同时适用于ASP.NET Core Blazor和Wind 阅读详情

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


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

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


         此时,单击CreateNewIssue默认显示是DemoIssue_ListView。但我们想将视图改为新建DemoIssue对象的DetailView,所以,需要重写ShowNavigationItemController的ShowNavigationItem方法。该方法会在ShowNavigationItemController.ShowNavigationItemAction的SingleChoiceAction.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);
                        }
                    }
                }
            }
        }
    }



逸风菜单控件YFMenu 一个仿QQ菜单控件,可以设置菜单项图标(支持png) 立即下载

相关推荐

XAF-让DetailView以PopupWondow打开(让DetailView以弹窗打开)

XAF教程,让DetailView以PopupWondow打开(让DetailView以弹窗打开)。 在ListView界面点击一条数据的时候会弹窗显示DetailView

XAF之Window, Frame和Template

XAF自动产生的窗体由两个对象定义:一个称为Template的control和一个抽象实体Window。而查询窗体和ListView由Template和Frame组合来表示。Window, Frame和Template的区别是:Window和Frame不包含控件的位置信息而仅含有XAF程序的功能信息。Template包含了控件的位置信息,决定了Window和Frame的外观。 Template

压碎起重机 2030

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7283

XAF开发学习(前置2)新建项目

使用VS2017选择新建项目 在 Visual C# 中选择 DevExpress v21.2 XAF Template Gallery 新建C#项目 类型如图所示 Winforms和Web同时选择 XPO模式 选择身份验证时按图所示选择 功能选择 所有选择项均在上图中 此时我们得到了一个新的VS项目,请修改数据库连接配置 Web.config <add na...

深海爱人@的博客 822

LTspice第三方SPICE模型集成全流程指南

SPICE模型是电子电路仿真的核心基础,它通过数学方程描述半导体器件的非线性、温度依赖与寄生特性,决定仿真结果是否具备工程可信度。其技术价值在于 bridging 理论参数与实测行为,显著提升电源、电机驱动及逻辑电路设计的一次成功率。典型应用场景包括IGBT开关损耗分析、LDO瞬态响应验证、CMOS逻辑门传播延迟评估等。而LTspice作为轻量级工业级工具,依赖用户主动集成原厂提供的.subckt或.model文本模型——这正是‘LTspice导入SPICE模型’和‘74HC14 SPICE模型’等高频搜索

weixin_33868027的博客 304

STM32F4三重ADC+DMA双缓冲实战:用CubeMX搞定同步采样,告别数据覆盖烦恼

本文详细介绍了STM32F4三重ADC与DMA双缓冲技术的实战应用,通过CubeMX配置实现同步采样,解决数据覆盖问题。内容涵盖硬件架构解析、CubeMX工程配置、双缓冲实现技巧及调试优化方法,适用于电机控制、电力监测等需要高精度多通道信号采集的场景。

weixin_30627341的博客 357

XAF学习笔记一:导航器直接打开DetailView

在使用XAF的过程中,经常有在点击导航器或Action时直接打开DetailView视图 using System; using System.Collections.Generic; using System.Text; using DevExpress.Express

hwhone的专栏 2168

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案

本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。

weixin_29232507的博客 1635

XAF之自定义登录窗口

当使用Standard Authentication验证类型,默认的登录窗口包含两个编辑框:用户名和密码。而本文讲述怎样自定义登录窗口,窗口包含一个下拉式列表选择company,另一个下拉式列表选择该company的employee,还有一个密码输入框。 自定义登录窗口,有以下两种方法: a.继承AuthenticationStandardLogonParameters类,添加要在登录

压碎起重机 3421

Python爬虫应对Cloudflare防护:5秒盾+Turnstile验证码实战(AST反混淆+指纹模拟,成功率95%)

Cloudflare 5秒盾+Turnstile验证码的防护核心,是通过“前端JS挑战+多维度指纹校验”确认请求来源的真实性。用AST反混淆还原CF的验证逻辑,避免执行无用代码导致的验证失败;基于真实浏览器采集指纹,确保指纹维度100%匹配真人环境;结合轻量级JS引擎和自动化工具,模拟完整的浏览器执行环境。该方案的绕过成功率可达95%(剩余5%主要是IP或请求频率导致的风控),适用于绝大多数部署CF防护的网站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析操作指导-单个颗粒

Default Strobe Offset:DQS默认偏移时间,自动填充为0.5ns,即DQS默认偏移1/2UI,DQS滞后于DQ 1/2UI,让建立保持时间均分。WLO:写平衡偏移的数值,DataL是0ps,DataU是500ps,是根据WLOSkew自动定义的,可以认为是WLOSkew取整,也可以根据需要手动调整数值。注意AddCmd的UI=T,这里的Data Rate仍然是DQ的速率,并不是地址线的速率,地址线的速率=1/UI=1/2ns=0.5Gbps。

weixin_54787054的博客 366

学习010-03-01 How to: Access the Navigation Control(如何:访问导航控制)

将新的窗口控制器添加到WinForms模块项目(MySolution.Module.Win)。如果启用了导航优化(WebApplication.OptimizationSettingsEnableNavigationControlDelayedCreation属性值为true),则CustomizeControl事件不会触发,因为不会通过回调重新创建导航控件。将新的窗口控制器添加到ASP.NETWeb窗体模块项目中,并覆盖其受保护的OnActivated方法以访问当前的Controller. Frame。

DevExpress Xaf 学习专栏 669

OpenClaw 多代理协同工作模式配置指南

OpenClaw 采用。

形上得其象,形下合于数;阴阳自济,玄理自明。 1万+

学习008-02-03-01 Add an Item to the Navigation Control(将项目添加到导航控件)

在树中,导航到NavigationItems|Items|Default|Items节点。NavigationItems节点及其子节点的结构对应于导航控件的结构。更改View属性值时,ImageName属性的值也会更改。XAF检查View的名称并在标准图片素材库中查找相应的图像。如果存在这样的图像,XAF会将其分配给导航项。单击时,此Notes项用于显示您在上一课中添加的Note业务类的列表视图:添加显示弹出窗口的操作。当您选择节点或聚焦属性时,模型编辑器会在窗格底部显示其类型和简短描述。

DevExpress Xaf 学习专栏 815

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

XAF - 审批流

很多朋友对XAF没有信心,认为他不能实现一些复杂的功能,我首先展示一些我用XAF所实现的,给大家在考虑是否要选择XAF做个参考。  转载请注明出处:http://my.youkuaiyun.com/liushitang 首先这个审批流必须实现[会计]、[知会]、[审批]、[加收]、[回退]等功能。 必须按照单据上的所有字段进行设置审批条件。如多少金额必须由谁审批。 必须方便别的单据进行调用。

liushitang的专栏 1241

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码

下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´  开发公司:www.devexpress.com,老牌控件公司 ´  从2006年发布第一个XAF版本,至今11年 ´  基于Microsoft.Net Framework ´  支持.Net Framework2.0-最新版(4.6.2) ´  支

vnddtt3b的专栏 600

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

高级应用开发框架DevExpress XAFv20.1版本亮点:性能增强、改进UX

DevExpress技术交流群2:775869749欢迎一起进群讨论 专注于您的业务需求,让eXpressApp框架处理所有的日常任务。不用理会数据库和用户界面管理的复杂性。eXpressApp框架会根据您的业务模式,自动完成这些任务……不管您需要将您的业务模式改变多少次。利用DevExpress备受赞誉的WinForms控件、ASP.NET控件和ORM工具的力量,停止编写千百万行的代码,开始提供解决方案。 DevExpress eXpressApp Framework(XAF) v20.1...

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 600

「案例分享」DevExpress XAF (WinForms UI)赋能医疗管理系统,让操作更自动化!

本文将为大家分享由DevExpress XAF和DevExpress WinForms UI组件驱动的一个医院管理系统,希望为相关行业的用户提供一些参考和借鉴。

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 953

在XAF中实现状态控制并级联更新部分属性

首先贴一个视频,是一个高手录制的,这里转载一下。 http://v.youku.com/v_show/id_XMTU0Mjc3MjUxMg==.html 在该视频中介绍了状态机的基本用法,关键点如下: 将状态机同对象的属性建立关联。 不同状态之间的变更关系。 在状态变更操作页面的权限控制 可以触发变更的人 可以修改那些属性 可以禁用那些按钮(此处提到,但是未详细说...

diyou8419的博客 374

XAF之刷新View的方法

有时,我们可能需要刷新View的显示内容,比如后台线程可能一直在向数据库里放数据,而XAF的显示对应数据库表的View是不会自动刷新的,除非手动点击刷新。这时可以在代码里控制定时刷新,刷新的方法有两种: 一.使用RefreshAction RefreshAction属于RefreshController,所以,在ViewController中得到该Controller即可 protect

压碎起重机 2045

通用审批流程快速开发系统案例分享

通用审批流程快速开发系统案例分享 公司组织机构是一个树形架构,先前新加盟公司时都是总部直接添加在某个子公司下,因审计需要,要求通过下面公司申请,逐个角色处理来完成新公司的开通,开发任务最后落到我这里,时间紧,任务重,先前也没接触多少审批流程的开发,好在我们的系统是基于通用权限管理系统的底层来做的开发,角色,权限控制已没什么问题,而且底层也集成有一个审批流程引擎组件,只是先前没多少人使用过,通过与...

cxu123321的博客 3277

XAF自定义启动页

本主题是官网指导教程 Use a Custom Class to Show a Splash Form 的补充。演示了如何创建自定义启动页(splash form)并使用。 具体步骤 1. 创建一个Splash Form窗体 右键解决方案中的WinForms应用工程(xxx.win),在弹出菜单中选择"添加"->“新建项”。 在弹出的窗体中点击 “Windows Form” -> “窗体(Windows 窗体)”,在窗体的最下方的名称中输入文件名"SplashScreenForm.cs",随后

非動ご博客 505

Devexpress XAF框架——基本知识及安装软件介绍

Devexpress XAF框架——基本知识XAF优点一、一次编码,多种平台同时使用通过一次代码编码写,可以同时产生四种项目:1,Web项目(b/s)2,win项目(c/s)3,平板电脑(beta)4,移动端(beta)其中web/win是两个项目,3,4都是web项目,只是使用了不同的适应界面可以在移动设备和平板电脑上进行浏览操作等。在Sliverlight刚出现的一段时间内,XAF曾试图支持S...

Ysiqiqi的博客 6749

xaf框架中web项目弹出提示框

//在Controllers文件夹下添加一个TestController.cs文件。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using DevExpress.Xpo; using DevExpress.ExpressApp; using DevExpress.Exp

寒枫 1929

【Devexpress】NavBarControl 通过代码添加

看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的。 后来自己摸索了一下。 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( string 名字)); 添加父节点 navBarControl1.Groups[i].ItemLinks.Add(new NavBarItem(string 名...

Sqsdhc的博客 965
上一篇: XAF之存储非标准数据库字段
下一篇: XAF 如何使用复合主键和复合外键
qjpcpu
博客等级 码龄15年 59粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值