Guest User

Untitled

a guest
Jul 19th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. public class PageBase : PhoneApplicationPage
  2. {
  3.  
  4. ...
  5. private List<Object> m_viewModels;
  6. public static Func<IViewModelResolver> ViewModelManager
  7. {
  8. get;
  9. set;
  10. }
  11.  
  12.  
  13.  
  14. protected override void OnNavigatedFrom(NavigationEventArgs e)
  15. {
  16.  
  17. base.OnNavigatedFrom(e);
  18. SaveState();
  19. handleAllDeactivated();
  20.  
  21. }
  22.  
  23. private T tryGetTypedViewModel<T>(object obj)
  24. where T: class
  25. {
  26. return obj as T;
  27. }
  28.  
  29. protected virtual void SaveState()
  30. {
  31.  
  32. var statebag = new KnownTypesDictionary();
  33. var rootPair = getRootpair();
  34. saveTransientState(rootPair, statebag, this, null);
  35. string stateKey = GetType().FullName;
  36. State[stateKey] = statebag;
  37. LastSavedTransientState = statebag;
  38.  
  39. }
  40.  
  41. private ElementIndexPair getRootpair()
  42. {
  43. var rootPair = new ElementIndexPair
  44. {
  45. Element = this,
  46. Parent = null,
  47. Index = 0
  48. };
  49. return rootPair;
  50. }
  51.  
  52. private void saveTransientState(ElementIndexPair pair, Dictionary<string, Object> stateBag, FrameworkElement root, Object lastDataContext)
  53. {
  54. if (ViewModelManager().IsView(pair.Element))
  55. {
  56.  
  57. var stateManager = getStateManager(pair.Element.DataContext);
  58.  
  59. if (stateManager != null && stateManager != lastDataContext)
  60. {
  61. lastDataContext = stateManager;
  62. saveStateInner(pair, stateBag, root, stateManager);
  63. }
  64. }
  65.  
  66. UIHelper.GetChildren(pair.Element)
  67. .ToList()
  68. .ForEach(elementPair =>
  69. {
  70. elementPair.Parent = pair;
  71. saveTransientState(elementPair, stateBag, root, lastDataContext);
  72. });
  73.  
  74. }
  75.  
  76. private static void saveStateInner(ElementIndexPair pair, Dictionary<string, Object> stateBag, FrameworkElement root, ITransientStateManager stateManager)
  77. {
  78. var state = stateManager.SaveState();
  79. if (state != null)
  80. {
  81. var stateKey = UIHelper.GetTransientStateKey(pair, root);
  82. stateBag[stateKey] = state;
  83. }
  84. }
  85.  
  86.  
  87. private ITransientStateManager getStateManager(Object obj)
  88. {
  89. var stateManager = obj as ITransientStateManager;
  90. return stateManager;
  91. }
  92.  
  93. private void handleAllDeactivated()
  94. {
  95. m_viewModels.ForEach(notifyDeactivated);
  96. }
  97.  
  98.  
  99. private void notifyDeactivated(object obj)
  100. {
  101. var deactivatedItem = tryGetTypedViewModel<IDeactivated>(obj);
  102. if (deactivatedItem != null)
  103. {
  104. deactivatedItem.Deactivate();
  105. }
  106. }
  107. }
  108. ...
  109. }
Add Comment
Please, Sign In to add comment