打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

概述

要实现这样一个功能,我之前是采用传统方式实现的,本节我采用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框架的优势所在。

源码提取

百度网盘链接:https://pan.baidu.com/s/1Qvi2LKHX_OpjDvvvcrijgw

提取码:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Web 开发工具箱: 120个 Web 开发工具 (上) - 基于 COMSHARP CM...
偶尔看到的一种新颖的流程控制方式 - w8u的专栏
if 中有return
学习笔记30-17
10款QQ空间免费信纸代码
基于STM32之OLED菜单界面框架搭建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服