在mvvm模式的wpf項目中有個需求需要去載入解決方案的程式集,並且根據程式集去動態載入當前程式集的類,做成下拉框形式。 效果: 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>