using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Media; using Caliburn.MemoryManagement; using Caliburn.Metadata; using Caliburn.Services; namespace Caliburn { public class PresenterManager : IPresenterManager { protected readonly Dictionary _presenterMetadata = new Dictionary(); protected readonly WeakDictionary _presenters = new WeakDictionary(); #region IPresenterManager Members public virtual void AddBinding(object presenter, DependencyObject target) { _presenters[target] = presenter; FrameworkElement element = target as FrameworkElement; if(element != null) element.DataContext = presenter; } public virtual void RemoveBinding(DependencyObject target) { _presenters.Remove(target); } public virtual PresenterBinding GetBinding(DependencyObject target) { if(target != null) { object presenter; if(_presenters.TryGetValue(target, out presenter)) return new PresenterBinding(target, presenter); else { try { DependencyObject parent = LogicalTreeHelper.GetParent(target); if (parent == null) parent = VisualTreeHelper.GetParent(target); return GetBinding(parent); } catch { return PresenterBinding.NotFound; } } } else return PresenterBinding.NotFound; } public virtual PresenterInfo GetInfo(Type presenterType) { PresenterInfo info; if (!_presenterMetadata.TryGetValue(presenterType, out info)) { info = PresenterInfo.Create(presenterType); _presenterMetadata[presenterType] = info; } return info; } public virtual IList GetBoundViews(object presenter) { List views = new List(); _presenters.RemoveCollectedEntries(); foreach(KeyValuePair binding in _presenters) { if(binding.Value == presenter) views.Add(binding.Key); } return new ReadOnlyCollection(views); } #endregion } }