123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- namespace Caliburn.Micro.Core {
- using System;
- using System.Collections.Generic;
- /// <summary>
- /// A base implementation of <see cref = "IViewAware" /> which is capable of caching views by context.
- /// </summary>
- public class ViewAware : PropertyChangedBase, IViewAware {
- readonly IDictionary<object, object> views;
- /// <summary>
- /// The default view context.
- /// </summary>
- public static readonly object DefaultContext = new object();
- /// <summary>
- /// The view chache for this instance.
- /// </summary>
- protected IDictionary<object, object> Views {
- get { return views; }
- }
- /// <summary>
- /// Creates an instance of <see cref="ViewAware"/>.
- /// </summary>
- public ViewAware() {
- views = new WeakValueDictionary<object, object>();
- }
- /// <summary>
- /// Raised when a view is attached.
- /// </summary>
- public event EventHandler<ViewAttachedEventArgs> ViewAttached = delegate { };
- void IViewAware.AttachView(object view, object context) {
- Views[context ?? DefaultContext] = view;
- var nonGeneratedView = PlatformProvider.Current.GetFirstNonGeneratedView(view);
- PlatformProvider.Current.ExecuteOnFirstLoad(nonGeneratedView, OnViewLoaded);
- OnViewAttached(nonGeneratedView, context);
- ViewAttached(this, new ViewAttachedEventArgs {View = nonGeneratedView, Context = context});
- var activatable = this as IActivate;
- if (activatable == null || activatable.IsActive) {
- PlatformProvider.Current.ExecuteOnLayoutUpdated(nonGeneratedView, OnViewReady);
- }
- else {
- AttachViewReadyOnActivated(activatable, nonGeneratedView);
- }
- }
- static void AttachViewReadyOnActivated(IActivate activatable, object nonGeneratedView) {
- var viewReference = new WeakReference(nonGeneratedView);
- EventHandler<ActivationEventArgs> handler = null;
- handler = (s, e) => {
- ((IActivate)s).Activated -= handler;
- var view = viewReference.Target;
- if (view != null) {
- PlatformProvider.Current.ExecuteOnLayoutUpdated(view, ((ViewAware)s).OnViewReady);
- }
- };
- activatable.Activated += handler;
- }
- /// <summary>
- /// Called when a view is attached.
- /// </summary>
- /// <param name="view">The view.</param>
- /// <param name="context">The context in which the view appears.</param>
- protected virtual void OnViewAttached(object view, object context) {
- }
- /// <summary>
- /// Called when an attached view's Loaded event fires.
- /// </summary>
- /// <param name = "view"></param>
- protected virtual void OnViewLoaded(object view) {
- }
- /// <summary>
- /// Called the first time the page's LayoutUpdated event fires after it is navigated to.
- /// </summary>
- /// <param name = "view"></param>
- protected virtual void OnViewReady(object view) {
- }
- /// <summary>
- /// Gets a view previously attached to this instance.
- /// </summary>
- /// <param name = "context">The context denoting which view to retrieve.</param>
- /// <returns>The view.</returns>
- public virtual object GetView(object context = null) {
- object view;
- Views.TryGetValue(context ?? DefaultContext, out view);
- return view;
- }
- }
- }
|