C# CM框架下一行代码实现多页面管理

概述

  • 之前我分享过一个wpf的项目实践,主页面左侧是个listbox,每次选择改变后呈现对应的页面,界面图如下:

    ddef2fb690aa39a60bd27ade475bd7a2.png

要实现这样一个功能,我之前是采用传统方式实现的,本节我采用CM框架下的Conductor<T>去实现,这样代码量可以大幅度压缩,核心代码就一行。

传统方式

  后台代码:

①定义集合并添加数据:

public IViewModel ActiveWindowView { get; set; }public ObservableCollection<string> ListBoxItems { get; set; } public string SelectedItem { get; set; }
ListBoxItems = new ObservableCollection<string>() { };ListBoxItems.Add("ShellView");ListBoxItems.Add("EventAggregatorView");ListBoxItems.Add("ConductorView");ListBoxItems.Add("MatchTemplateView");ListBoxItems.Add("IndicatorLightView");ListBoxItems.Add("MemorandumView");ListBoxItems.Add("FTPTestView");

②listbox选择改变后切换页面:

public void ListBoxItems_SelectionChanged(){switch(SelectedItem){case "ShellView":ActiveWindowView = new ShellViewModel();break;case "EventAggregatorView":ActiveWindowView = EventAggregatorViewModel.Instance; break;case "ConductorView":ActiveWindowView = new ConductorViewModel(); break;case "MatchTemplateView":ActiveWindowView = new MatchTemplateViewModel(); break;case "IndicatorLightView":ActiveWindowView = new IndicatorLightViewModel(); break;case "MemorandumView":ActiveWindowView = IoC.Get<MemorandumViewModel>(); break;case "FTPTestView":ActiveWindowView = new FTPTestViewModel(new FTPConfig()); break;default:break;}}

③前台绑定:

<ListBox Name="ListBoxItems" Grid.Column="0" SelectedItem="{Binding SelectedItem}" Margin="2"cal:Message.Attach="[Event SelectionChanged] = [Action ListBoxItems_SelectionChanged]"/><ContentControl Name="ActiveWindowView"/>

利用CM框架下Conductor<T>实现

 ① 后台代码:

首先是需要继承Conductor<IViewModel>.Collection.OneActive这样才能使用这个类下面的方法和属性,其次是构造函数需要添加接收的接口

IEnumerable<T>,这样改造完代码如下:

public MainWindowViewModel(IEnumerable<IViewModel> modules){Items.AddRange(modules);ActivateItem(Items.FirstOrDefault(vm => vm.GetType() ==typeof(IndicatorLightViewModel)));}

如果不考虑首次激活的页面那核心代码就只有一句:

Items.AddRange(modules);

②前台代码:

<ListBox Name="Items" Grid.Column="0"  Margin="2" DisplayMemberPath="DisplayName"/><ContentControl Name="ActiveItem"/>

这样前后台就设置完事了,继承了一个框架的多屏幕管理类,使得前后台代码大幅度精简,功能上也没打折扣,准确说是更强大了,这就是CM框架的优势所在。

源码提取

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用DW设计界面 结合 VS设计后台代码

原文发布时间为&#xff1a;2008-11-02 —— 来源于本人的百度文章 [由搬家工具导入]问&#xff1a;在vs.net里有form标记&#xff0c;而dw里却没有&#xff0c;两个里面的标记代码都不一样&#xff0c;怎么能通用&#xff1f; 在.net里修改dw的文件&#xff0c;或在dw里修改a…

java中instanceof 详解_java中的instanceof用法详解

instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例&#xff0c;返回的是boolean类型的数据。用它来判断某个对象是否是某个Class类的实例。用法&#xff1a;boolean result object instanceof class参数&#xf…

关于JAVA异常处理的20个最佳实践

关于JAVA异常处理的20个最佳实践 在我们深入了解异常处理最佳实践的深层概念之前&#xff0c;让我们从一个最重要的概念开始&#xff0c;那就是理解在JAVA中有三种一般类型的可抛类: 检查性异常(checked exceptions)、非检查性异常(unchecked Exceptions) 和 错误(errors)。 异…

Atitit Data Matrix dm码的原理与特点

Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode&#xff0c;由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。 Datamatrix是一种矩阵式二维条码&#xff0c;其发展的构想是希望在较小的条码标签上存入更多的资料量。Datamatrix的最小…

SSM框架搭建(四) springmvc和mybatis的配置

SSM框架搭建&#xff08;一&#xff09; JDK和MAVEN环境搭建 SSM框架搭建&#xff08;二&#xff09; 创建MAVEN项目 SSM框架搭建&#xff08;三&#xff09; 数据库创建和MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件 SSM框架搭建&#xff08;四&#xff09; sprin…

10 个有关 String 的面试问题

2019独角兽企业重金招聘Python工程师标准>>> 下面是面试中最容易问到的有关String的问题。 1. 如何比较两个字符串&#xff1f;使用“”还是equals()方法&#xff1f; 简单来讲&#xff0c;“”测试的是两个对象的引用是否相同&#xff0c;而equals()比较的是两个字…

基于ASP.NET Core 6.0的整洁架构

背景最近尝试录制了一个系列视频&#xff1a;《ASP.NET Core 6.0Vue.js 3 实战开发》&#xff0c;本节是视频内部整洁架构的理论和实战的文字稿。因为在录制之前&#xff0c;我通常会编写完整的文字内容作为视频文案&#xff0c;这里分享给大家&#xff0c;希望对你有所帮助。如…

大并发数据队列

图解#include<stdio.h>#include<stdlib.h>#include<memory.h>#define N 100#define mytype intstruct MyQueue{mytype data[N];//数组存储队列int front;//拉屎int rear;//吃东西};typedef struct MyQueue myQ;//初始化void init(myQ *p){p->front p->…

java单精度实型_Java的八种基本类型及其各种数据类型的相互转换

一、八种基本类型1、六种数字类型(四个整数型&#xff0c;两个浮点型)字节型byte 8位-2^7到2^7短整型short 16位整型int 32位 长整型long 64位单精度float 32位 双精度double 64位2、一种字符类型字符型char 8位3、还有一种布尔型。布尔型&#xff1a;boolean 8位 可存储&q…

geotrellis使用(二十九)迁移geotrellis至1.1.1版

目录 前言升级过程总结一、前言 由于忙着安装OpenStack等等各种事情&#xff0c;有半年的时间没有再亲密的接触geotrellis&#xff0c;甚至有半年的时间没能畅快的写代码。近来OpenStack折腾的稍见成效&#xff0c;历经九九八十一Failure后成功的在16台服务器上搭建了云平台&am…

python中的logger模块详细讲解

logger 提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出格式 logging模块介绍 Python的logging模块提供了通用的日志系统&#xff0c;熟练使用logging模块可…

总在用户态调试 C# 程序,终还是搭了一个内核态环境

一&#xff1a;背景 一直在用 WinDbg 调试用户态程序&#xff0c;并没有用它调试过 内核态&#xff0c;毕竟不是做驱动开发&#xff0c;也没有在分析 dump 中需要接触用内核态的需求&#xff0c;但未知的事情总觉得很酷&#xff0c;加上最近在看 《深入解析 Windows 操作系统》…

CentOS搭建Sqoop环境

Sqoop是一个用来将Hadoop&#xff08;Hive、HBase&#xff09;和关系型数据库中的数据相互转移的工具&#xff0c;可以将一个关系型数据库&#xff08;例如&#xff1a;MySQL ,Oracle ,Postgres等&#xff09;中的数据导入到Hadoop的HDFS中&#xff0c;也可以将HDFS的数据导入到…

bat kafka启动_windows下搭建Kafka,并通过命令窗口收发消息

参考网址&#xff1a;前提条件&#xff1a;windows环境需要安装jdk2.由于Kafka依赖于zookeeper&#xff0c;所以也需要下载zookeeper,可以通过官网下载http://zookeeper.apache.org/3.安装zookeeper将压缩包解压后&#xff0c;到bin目录下&#xff0c;启动zkServer.bat即可注意…

异常处理、socke基于TCP协议编程

一、异常处理 1、错误和异常 1.程序中难免出现错误&#xff0c;而错误分成两种 &#xff08;1&#xff09;语法错误&#xff08;这种错误过不了Python解释器的语法检测&#xff0c;必须在程序执行前改正&#xff09; #语法错误示范一 if#语法错误示范二 def test:pass#语法错误…

getComputedStyle方法的那些事

一、getComputedStyle是&#xff1f;getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration])&#xff0c;只读。 getComputedStyle() gives the final used values of all the CSS properties of an elem…

maven正确的集成命令-U-B

http://healthandbeauty.iteye.com/blog/1618501 在持续集成服务器上使用怎样的 mvn 命令集成项目&#xff0c;这个问题乍一看答案很显然&#xff0c;不就是 mvn clean install 么&#xff1f;事实上比较好的集成命令会稍微复杂些&#xff0c;下面是一些总结&#xff1a; 不要忘…

如何避免 .NET 中 HttpClient 的 DNS 失效问题?

HttpClient 可以用来发送 HTTP 请求。HttpClient 可以设置为单例并在整个生命周期中重复使用。这是因为&#xff0c;HttpClient 有一个“连接池”来重用连接并减少 TCP 连接的数量。因此&#xff0c;如果您向同一主机发送多个请求&#xff0c;它们将重用相同的连接。这样&#…

POJ 1159 Palindrome(字符串变回文:LCS)

POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem?id1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变成一个回文串. 分析: 首先把原字符串和它的逆串进行匹配, 找出最长公共子序列. 那么最长公共子序列的字符串肯定是一个回文串. 所…

java excutorthread_Java中ThreadPoolExecutor的参数理解

一、使用Executors创建线程池之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法。当然Executors也是用不同的参数去new ThreadPoolExecutor1. newFixedThreadPool()创建线程数固定大小的线程池。 由于使用…