概述 本文講述下拉框和枚舉類型進行綁定的一些操作。 下拉框的基本操作 設計部分: <ComboBox ItemsSource="{Binding Fruits}" SelectedItem="{Binding SelectedFruit}" SelectedIndex="{Binding Selec ...
說明:這裡只是VirtualMethodInterceptor攔截器的處理,下麵代碼中用到的ViewModelCommandBehavior是對IInterceptionBehavior介面的實現
主要就是用反射獲取到相應的方法來執行指定的操作
問題:通常是用下麵註釋掉的 interception.RegisterSingleton 來註冊,但是當需要註冊的類很多或者不確定時會很不方便,所以改用下麵的方法來自動完成相關類的註冊
void SetInterceptor() { IUnityContainer unityContainer = new UnityContainer(); IUnityContainer interception = unityContainer.AddNewExtension<Interception>(); //interception.RegisterSingleton<CustomViewModel>(new Interceptor<VirtualMethodInterceptor>(), new InterceptionBehavior<ViewModelCommandBehavior>()); //return; Assembly assem = Assembly.GetExecutingAssembly(); var types = assem.ExportedTypes; foreach (Type item in types) { //具體做哪些限制根據實際情況來 if (item.IsClass && typeof(ViewModelBase).IsAssignableFrom(item)) { //這裡可以加一些其它的限制,目前值用於CustomViewModel if (item.FullName == typeof(CustomViewModel).FullName) { //可以參考上面的RegisterSingleton方法調用,這裡的RegisterSingleton是用的擴展類中的擴展方法 //所以在查找方法時是直接在擴展類中找的,而且因為擴展方法是靜態方法所以Invoke執行時對象可以設置為null var method = typeof(UnityContainerExtensions).GetMethods(BindingFlags.Static | BindingFlags.Public) .Where(x => x.Name == "RegisterSingleton" && x.IsGenericMethod == true && x.GetGenericArguments().Length == 1 && x.GetParameters().Length == 2 && x.GetParameters()[1].ParameterType.FullName == typeof(InjectionMember[]).FullName).FirstOrDefault(); if (method != null) { method = method.MakeGenericMethod(new Type[] { item }); InjectionMember[] injectionMembers = new InjectionMember[2]; injectionMembers[0] = new Interceptor<VirtualMethodInterceptor>(); injectionMembers[1] = new InterceptionBehavior<ViewModelCommandBehavior>(); object[] pars = new object[2]; pars[0] = interception; pars[1] = injectionMembers; method.Invoke(null, pars); } } } } }