/// <summary>
        /// construct the presentation state with an event aggregator, to send/receive update events
        /// </summary>
        /// <param name="eventAggregator"></param>
        public PresentationStateViewModel(IEventAggregator eventAggregator, IFrameUpdateManager fum)
        {
            _eventAggregator = eventAggregator;
            _fum             = fum;

            // store the UI thread SynchronizationContext
            _syncContext = SynchronizationContext.Current;
            System.Diagnostics.Trace.Assert(_syncContext != null);
        }
        /// <summary>
        /// constructs a new LayeredViewViewModel, and wires up the necessary events
        /// </summary>
        /// <param name="container">the unity container for resolving things</param>
        /// <param name="eventAggregator">the event aggregator for sending/receiving</param>
        /// <param name="repository">the model repository</param>
        public LayeredViewViewModel(IUnityContainer container,
                                    IEventAggregator eventAggregator,
                                    IModelRepository repository)
        {
            _container       = container;
            _eventAggregator = eventAggregator;
            _repository      = repository;

            // store the UI thread SynchronizationContext
            _uiUpdateContext = SynchronizationContext.Current;
            System.Diagnostics.Trace.Assert(_uiUpdateContext != null);

            // create a new PresentationState view model and add to the active layer
            PresentationState = _container.Resolve <PresentationStateViewModel>();
            ActiveLayer.Add(PresentationState);

            // subscribe to events
            _eventAggregator.GetEvent <NavigationPointUpdateEvent>()
            .Subscribe(OnNavigationPointUpdated, ThreadOption.UIThread);
            _eventAggregator.GetEvent <ImageDataLoadedEvent>()
            .Subscribe(OnImageDataLoadedEvent, ThreadOption.UIThread);
            _eventAggregator.GetEvent <VolumeUpdatedEvent>()
            .Subscribe(OnVolumeUpdatedEvent, ThreadOption.UIThread);
            _eventAggregator.GetEvent <SetIsocurveLevelEvent>()
            .Subscribe(OnSetIsocurveLevel, ThreadOption.UIThread);

            // set up the performance counters
            FrameRatePerformance       = new PerformanceCounter("FrameRate", _uiUpdateContext);
            BackgroundLayerPerformance = new PerformanceCounter("BackLayer", _uiUpdateContext);
            PassiveLayerPerformance    = new PerformanceCounter("PassLayer", _uiUpdateContext);

            _renderUpdateManager = _container.Resolve <IFrameUpdateManager>();
            if (_renderUpdateManager.UiUpdatePerformance == null)
            {
                _renderUpdateManager.UiUpdatePerformance = new PerformanceCounter("UIUpdate", _uiUpdateContext);
            }
            UiUpdatePerformance = _renderUpdateManager.UiUpdatePerformance;
        }