• 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 > 0)
                    {
                        ClassList = new List<string>();
                        var Companies = e.AddedItems[0].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 > 0)
                    {
                        var Companies = e.AddedItems[0].ToString();
                        RightModule.ClassName = Companies;
                    }
                    e.Handled = true;
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
            }

    wpf窗体:

    //程序集下拉框
                    <ComboBox Grid.Row="5" Grid.Column="1" ItemsSource="{Binding AssemblyList}" SelectedIndex="0" cm:Message.Attach="[Event SelectionChanged]=[abList_SelectionChanged($source,$eventArgs)];"  Text="{Binding RightModule.AssemblyName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left"  Width="252" Height="25"  IsEditable="True" Margin="5,3"></ComboBox>
    
    //类下拉框
                    <ComboBox Grid.Row="6" Grid.Column="1" ItemsSource="{Binding ClassList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedIndex="0" cm:Message.Attach="[Event SelectionChanged]=[classList_SelectionChanged($source,$eventArgs)];"  Text="{Binding RightModule.ClassName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left"  Width="252" Height="25"  IsEditable="True" Margin="5,3"></ComboBox>
  • 相关阅读:
    Leap Ftp 3.0注册码
    Access数据库导入到MSSQLServer数据库中的三种办法。
    flash上传插件uploadify详解_图片批量上传_更新数据库
    Winform(c#)手机号码归属地查询的实现
    百度再度出现故障,目前很多地区无法正常访问!
    windows 2000/2003 自动重启/定时重启
    js初步学习
    考研之三战讨论
    C++中的map学习
    BUPT 63T 高才生 找最佳基站
  • 原文地址:https://www.cnblogs.com/qinyi173/p/7092983.html
Copyright © 2020-2023  润新知