MVVMの下で反射を利用して動的にViewModelを作成して一例を実現する

3474 ワード


MVVMでは、一般的に、View Modelがアプリケーション全体で1つのインスタンスしかないことを望んでいます.従来の方法は、単一のインスタンスモードで実現することです.
public class ViewModelTest {   private ViewModelTest()   {   }
  private static ViewModelTest viewModelInstace;
  public static ViewModelTest GetViewModelTestInstace()   {     if (viewModelInstace == null)     {       viewModelInstace = new ViewModelTest();     }     return viewModelInstace;   } }
上記は従来の単一モデルですが、開発時には多くのViewModelがあります.各ViewModelが単一モデルを実現すれば、作業量は間違いなく大きなエンジニアリングです.そこで、ここでは、反射を利用して、コードを実現するための簡単な一般的な方法を提供する.
一:まずAppで.xaml.csの下のOnStartUpイベントは、私たちのView Modelを格納するためにグローバルな辞書セットを宣言します.
protected override void OnStartup(StartupEventArgs e) {   base.OnStartup(e);
//View Modelグローバルマッピングアプリケーションを作成する.Current.Properties["ViewModelMap"] = new Dictionary(); }
二:反射ダイナミックによるViewModelの作成
 public class ViewModelFactory

    {

        public static object GetViewModel(Type vm_type)

        {

            Dictionary<string, object> dic = Application.Current.Properties["ViewModelMap"] as Dictionary<string, object>;

            if (dic.ContainsKey(vm_type.FullName))

            {return dic[vm_type.FullName];

            }

            else

            {object new_vm = Activator.CreateInstance(vm_type);

                dic.Add(vm_type.FullName, new_vm);

                return new_vm;

            }

        }

3:ViewにDataContextを指定するときにGetView Modelメソッドを直接呼び出せばよい
 public class ViewModelTest

    {

        private ViewModelTest() 

        { 

        

        }

    }
public partial class ViewModelTestWindow : Window

{

    public Window()

     {

        this.InitializeComponent();



        this.DataContext = ViewModelFactory.GetViewModel(typeof(ViewModelTest));



     }

}