using System.Windows; using Caliburn.Metadata; using Caliburn.Presenters; using Caliburn.Services; namespace Caliburn.Controls { public class PresenterHost : TransitionPresenter { #region Fields public static readonly DependencyProperty PresenterProperty = DependencyProperty.Register( "Presenter", typeof(object), typeof(PresenterHost), new PropertyMetadata(PresenterChanged) ); #endregion #region Properties public object Presenter { get { return GetValue(PresenterProperty); } set { SetValue(PresenterProperty, value); } } #endregion #region Event Handlers private static void PresenterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if(e.OldValue != e.NewValue) { IPresenterManager presenterManager = DI.Resolve(); PresenterHost host = (PresenterHost) d; if(e.OldValue != null) presenterManager.RemoveBinding(host); if(e.NewValue != null) { presenterManager.AddBinding(e.NewValue, host); if(host.Content == null) { IHostedPresenter hostedPresenter = e.NewValue as IHostedPresenter; if (hostedPresenter != null && hostedPresenter.CurrentView != null) { host.Content = hostedPresenter.CurrentView; } else { PresenterInfo info = presenterManager.GetInfo(e.NewValue.GetType()); DefaultViewAttribute defaultView = info.GetMetadata(); if(defaultView != null) host.Content = defaultView.CreateView(); } } } } } protected override void BeginTransition() { base.BeginTransition(); IHostedPresenter hostedPresenter = Presenter as IHostedPresenter; if (hostedPresenter != null) hostedPresenter.CurrentView = CurrentContentPresenter.Content; } #endregion } }