mvvm模式下在WPF项目中动态加载项目的程序集和类
在mvvm模式的wpf项目中有个需求需要去加载解决方案的程序集,并且根据程序集去动态加载当前程序集的类,做成下拉框形式。
效果:

//全局定义
private ComboBox abList= null;
/// <summary>
/// 加载所有项目的程序集
/// </summary>
public void LoadAssembly()
{
abList=new ComboBox();
IList<FileInfo> list = new List<FileInfo>();
FileInfo[] files = new DirectoryInfo(System.Environment.CurrentDirectory).GetFiles("*.dll");
foreach (FileInfo info2 in files)
{ try
{
if (info2.Name.Contains("Reform"))
{
abList.Items.Add(info2);
}
}
catch
{
continue;
} }
}
//属性定义
private List<string> assemblyList;
/// <summary>
/// 程序集列表下拉框数据源
/// </summary>
public List<string> AssemblyList
{
get { return assemblyList; }
set
{
assemblyList = value;
NotifyOfPropertyChange("AssemblyList");
}
}
private List<string> classList; /// <summary>
///类列表下拉框数据源
/// </summary>
public List<string> ClassList
{
get { return classList; }
set
{
classList = value;
NotifyOfPropertyChange("ClassList");
}
}
//初始化数据
public InitData ()
{
//给程序集下拉框赋值
foreach (var assemblyListItem in abList.Items)
{
AssemblyList.Add(assemblyListItem.ToString());
}
....... }
/// <summary>
/// 程序集改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void abList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
if (e != null && e.AddedItems.Count > )
{
ClassList = new List<string>();
var Companies = e.AddedItems[].ToString();
//加载对应类
foreach (var assemblyItem in abList.Items)
{
if (assemblyItem.ToString() == Companies)
{
FileInfo selectedItem = assemblyItem as FileInfo;
if (selectedItem != null)
{
System.Type[] types = Assembly.LoadFile(selectedItem.FullName).GetTypes();
foreach (System.Type type2 in types)
{
if ((type2.IsClass && type2.IsPublic)&& type2.FullName.Contains("Reform"))
{
ClassList.Add(type2.FullName);//类下拉框赋值
}
}
}
break;
}
}
}
e.Handled = true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 类选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void classList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
if (e != null && e.AddedItems.Count > )
{
var Companies = e.AddedItems[].ToString();
RightModule.ClassName = Companies;
}
e.Handled = true;
}
catch (Exception ex)
{ throw ex;
}
}
wpf窗体:
//程序集下拉框
<ComboBox Grid.Row="" Grid.Column="" ItemsSource="{Binding AssemblyList}" SelectedIndex="" cm:Message.Attach="[Event SelectionChanged]=[abList_SelectionChanged($source,$eventArgs)];" Text="{Binding RightModule.AssemblyName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Width="" Height="" IsEditable="True" Margin="5,3"></ComboBox> //类下拉框
<ComboBox Grid.Row="" Grid.Column="" ItemsSource="{Binding ClassList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedIndex="" cm:Message.Attach="[Event SelectionChanged]=[classList_SelectionChanged($source,$eventArgs)];" Text="{Binding RightModule.ClassName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Width="" Height="" IsEditable="True" Margin="5,3"></ComboBox>
mvvm模式下在WPF项目中动态加载项目的程序集和类的更多相关文章
- VUE 单选下拉框Select中动态加载 默认选中第一个
<lable>分类情况</lable> <select v-model="content.tid"> <option v-for=&quo ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 在ASP.NET中动态加载内容(用户控件和模板)
在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...
- 在MVC应用程序中动态加载PartialView
原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...
- 在VC中动态加载ODBC的方法
在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...
- vue中动态加载img
想实现动态加载图片,当点击“首页”时,图片变色 代码如下: <mt-tabbar v-model="selected" fixed class="border-1p ...
- vue中动态加载组件+开发者模式+JS参数值传递和引用传递
今天写vue里面通过接口反参动态加载组件时候 跟着同学...学习到了 一.先说说vue 内置组件 component 的用法 component组件可以来专门用来进行组件的切换,使用is来绑定你的组件 ...
- ExtJs中动态加载机制研究(转)
觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...
随机推荐
- 四、ABP 学习系列 - 配置Swagger
一.再XX.Web项目中用Nuget安装Swashbuckle.AspNetCore.SwaggerGen和Swashbuckle.AspNetCore.SwaggerUI 二.在Startup.cs ...
- Ext.tree.Panel
initComponent : function() { var data = null; Ext.Ajax.request({ url : 'xxx/xx', ...
- who命令参数及用法详解(linux查看在线用户命令)
功能说明:显示目前登入系统的用户信息. 语 法:who [-Himqsw][--help][--version][am i][记录文件] 补充说明:执行这项指令可得知目前有那些用户登入系统,单独执 ...
- top命令 Linux查看CPU和内存使用情况,cpu监控之一
一.top命令 top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要.但是,它的缺点是会消耗很多系统资源. 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分 ...
- Unreal Engine 4 Radiant UI 入门教程(一)制作Radiant HUD
请注意:本篇教程的编号是从零开始的,如果没有看第零篇教程,请前往学习. 本教程介绍如何制作Radiant HUD,这是指将网页元素直接加入到HUD中,效果为: 对应的网页元素为: 第一步: 将之前下载 ...
- 转:三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构
在微信公众号看到一篇关于mycat的文章,觉得分析的很不错,给大家分享一下 三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构 原文链接:https://mp.weixin.qq.com/s ...
- Oracle 多表查询(1)
一.基本概念 多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,…]FROM 表名称 [别名], [表名称 [别名] ,…][WHERE 条件(S ...
- I/O完成端口(IOCP)
服务器: #include "stdafx.h" #include <winsock2.h> #pragma comment(lib, "ws2_32.lib ...
- asp.net mysql 链接类
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;u ...
- LNMP 1.6 常见的502问题解决
在nginx上跑discuz,先修改配置文件 cd /usr/local/nginx/conf/vhosts/ vim test.conf server { listen ; server_name ...