在MVVM一般情况下都会希望ViewModel 在整个应用程序中只有一份实例 传统的做法是用单例模式去实现 :
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 事件声明一个全局的字典集合 用于存储我们的ViewModel
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 创建ViewModel全局映射
Application.Current.Properties["ViewModelMap"] = new Dictionary<string, object>();
}
二:利用反射动态创建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; } }
三:给View指定DataContext时直接调用GetViewModel方法就可以了
public class ViewModelTest { private ViewModelTest() { } }
public partial class ViewModelTestWindow : Window { public Window() { this.InitializeComponent(); this.DataContext = ViewModelFactory.GetViewModel(typeof(ViewModelTest)); } }