如何搭建新的WPF项目框架

2019-12-26 13:02:37丽君

为什么用一个Dictionary 将ViewModel 缓存起来,相信利用MVVM模式开发大多数的开发者碰到的问题无疑是各个VM之间的数据通信问题,利用Dictionary缓存起来有两个好处:

1、可以解决VM之间相互通信的问题(当然你也可以用MvvmLight的 Message机制来通信,PS:个人认为完全没必要用MvvmLight中的 Messgae,如果我们框架搭的合理完全可以规避去用MvvmLight中 Message,Message比较难于管理,如果在我们的代码中出现大量的Message无疑是一件痛苦的事情,所以笔者不推荐用MvvmLight中的Message)

2、如果我们的应用程序要频繁的与服务器做交互,我们完全可以用缓存,以避免每次都去请求服务器(可以缓存一些在应用程序中一直使用的数据,规避二次请求)

public static T GetViewModel() where T : ViewModelBase 这个函数(将我们的VM完全限定名作为KEY缓存)适用于单例模式的VM,

public static T GetViewModel(object[] data,string id) where T : ViewModelBase 这个函数(主要构件带参数的VM构造函数,id是唯一ID),为什么会用到它,举个例子

例如我们的QQ聊天窗口,所有聊天窗口基本相同用到的VM类型也是相同,所以这时候就需要多个VM实例了,第一种方法就行不通了 所以会用到这种方法去构建VM,并将id作为KEY值缓存起来

第二步:构建我们的ViewModel 基类:

 

 
  1. public delegate void CloseEventHandle(object sender);  public class CustomViewModel : ViewModelBase 
  2. {   
  3. public event CloseEventHandle CloseEvent;  protected bool hasData; 
  4.   public CustomViewModel() 
  5. {  LoadCommand = new RelayCommand(() => 
  6. {  if (!hasData) 
  7. {   
  8. ThreadPool.QueueUserWorkItem((obj) =>  { 
  9. lock (this)  { 
  10. OnLoad();  hasData = true; 
  11. }  }); 
  12. }  }); 
  13. }public RelayCommand LoadCommand { private set; get; }   
  14. protected virtual void OnLoad()  { 
  15.   } 
  16.   protected void OnClose(object sender) 
  17. {  if (sender != null && CloseEvent != null) 
  18. {  CloseEvent(sender);