Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class PageBase : PhoneApplicationPage
- {
- ...
- private List<Object> m_viewModels;
- public static Func<IViewModelResolver> ViewModelManager
- {
- get;
- set;
- }
- protected override void OnNavigatedFrom(NavigationEventArgs e)
- {
- base.OnNavigatedFrom(e);
- SaveState();
- handleAllDeactivated();
- }
- private T tryGetTypedViewModel<T>(object obj)
- where T: class
- {
- return obj as T;
- }
- protected virtual void SaveState()
- {
- var statebag = new KnownTypesDictionary();
- var rootPair = getRootpair();
- saveTransientState(rootPair, statebag, this, null);
- string stateKey = GetType().FullName;
- State[stateKey] = statebag;
- LastSavedTransientState = statebag;
- }
- private ElementIndexPair getRootpair()
- {
- var rootPair = new ElementIndexPair
- {
- Element = this,
- Parent = null,
- Index = 0
- };
- return rootPair;
- }
- private void saveTransientState(ElementIndexPair pair, Dictionary<string, Object> stateBag, FrameworkElement root, Object lastDataContext)
- {
- if (ViewModelManager().IsView(pair.Element))
- {
- var stateManager = getStateManager(pair.Element.DataContext);
- if (stateManager != null && stateManager != lastDataContext)
- {
- lastDataContext = stateManager;
- saveStateInner(pair, stateBag, root, stateManager);
- }
- }
- UIHelper.GetChildren(pair.Element)
- .ToList()
- .ForEach(elementPair =>
- {
- elementPair.Parent = pair;
- saveTransientState(elementPair, stateBag, root, lastDataContext);
- });
- }
- private static void saveStateInner(ElementIndexPair pair, Dictionary<string, Object> stateBag, FrameworkElement root, ITransientStateManager stateManager)
- {
- var state = stateManager.SaveState();
- if (state != null)
- {
- var stateKey = UIHelper.GetTransientStateKey(pair, root);
- stateBag[stateKey] = state;
- }
- }
- private ITransientStateManager getStateManager(Object obj)
- {
- var stateManager = obj as ITransientStateManager;
- return stateManager;
- }
- private void handleAllDeactivated()
- {
- m_viewModels.ForEach(notifyDeactivated);
- }
- private void notifyDeactivated(object obj)
- {
- var deactivatedItem = tryGetTypedViewModel<IDeactivated>(obj);
- if (deactivatedItem != null)
- {
- deactivatedItem.Deactivate();
- }
- }
- }
- ...
- }
Add Comment
Please, Sign In to add comment