標籤:style blog io ar color sp on div art
在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)); }}
MVVM下 利用反射動態建立ViewModel 實現單例