/// <summary>
        /// PopupTimeSelectionModeProperty property changed handler.
        /// </summary>
        /// <param name="d">TimePickerPopup that changed its PopupTimeSelectionMode.</param>
        /// <param name="e">Event arguments.</param>
        private static void OnPopupTimeSelectionModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TimePickerPopup source = (TimePickerPopup)d;

            PopupTimeSelectionMode value = (PopupTimeSelectionMode)e.NewValue;

            if (!source.GetValidPopupTimeSelectionModes().Contains(value))
            {
                // revert to old value
                source.SetValue(PopupTimeSelectionModeProperty, e.OldValue);

                string message = string.Format(
                    CultureInfo.InvariantCulture,
                    Properties.Resources.TimePicker_PopupTimeSelectionModeNotValid,
                    value);

                throw new ArgumentOutOfRangeException("e", message);
            }

            // potentially flow back to parent.
            if (source.TimePickerParent != null && source.TimePickerParent.PopupTimeSelectionMode != value)
            {
                source.TimePickerParent.SetValue(TimePicker.PopupTimeSelectionModeProperty, value);
            }

            source.OnPopupTimeSelectionModeChanged((PopupTimeSelectionMode)e.OldValue, (PopupTimeSelectionMode)e.NewValue);
            source.UpdateVisualState(true);
        }
        /// <summary>
        /// Update the current visual states.
        /// </summary>
        /// <param name="useTransitions">
        /// True to use transitions when updating the visual state, false to
        /// snap directly to the new visual state.
        /// </param>
        internal virtual void UpdateVisualState(bool useTransitions)
        {
            // Contained state
            VisualStateManager.GoToState(this, TimePickerParent == null ? NotContainedStateName : ContainedStateName, useTransitions);

            // Popup mode, visual states directly match enum names.
            VisualStateManager.GoToState(this, PopupTimeSelectionMode.ToString(), useTransitions);

            // Handle the Common and Focused states
            _interaction.UpdateVisualStateBase(useTransitions);
        }
        /// <summary>
        /// Called when the time selection mode is changed.
        /// </summary>
        /// <param name="oldValue">The old value.</param>
        /// <param name="newValue">The new value.</param>
        protected override void OnPopupTimeSelectionModeChanged(PopupTimeSelectionMode oldValue, PopupTimeSelectionMode newValue)
        {
            base.OnPopupTimeSelectionModeChanged(oldValue, newValue);

            if (newValue != PopupTimeSelectionMode.HoursAndMinutesOnly)
            {
                // revert to old value
                SetValue(PopupTimeSelectionModeProperty, oldValue);

                string message = string.Format(
                    CultureInfo.InvariantCulture,
                    Properties.Resources.TimePicker_PopupTimeSelectionModeNotValid,
                    newValue);

                throw new ArgumentOutOfRangeException("newValue", message);
            }
        }
        /// <summary>
        /// Called when the time selection mode is changed.
        /// </summary>
        /// <param name="oldValue">The old value.</param>
        /// <param name="newValue">The new value.</param>
        protected override void OnPopupTimeSelectionModeChanged(PopupTimeSelectionMode oldValue, PopupTimeSelectionMode newValue)
        {
            base.OnPopupTimeSelectionModeChanged(oldValue, newValue);

            if (newValue != PopupTimeSelectionMode.HoursAndMinutesOnly)
            {
                // revert to old value
                SetValue(PopupTimeSelectionModeProperty, oldValue);

                string message = string.Format(
                    CultureInfo.InvariantCulture,
                    Properties.Resources.TimePicker_PopupTimeSelectionModeNotValid,
                    newValue);

                throw new ArgumentOutOfRangeException("newValue", message);
            }
        }
 /// <summary>
 /// Called when the time selection mode is changed.
 /// </summary>
 /// <param name="oldValue">The old value.</param>
 /// <param name="newValue">The new value.</param>
 protected virtual void OnPopupTimeSelectionModeChanged(PopupTimeSelectionMode oldValue, PopupTimeSelectionMode newValue)
 {
 }
 /// <summary>
 /// Called when the time selection mode is changed.
 /// </summary>
 /// <param name="oldValue">The old value.</param>
 /// <param name="newValue">The new value.</param>
 protected virtual void OnPopupTimeSelectionModeChanged(PopupTimeSelectionMode oldValue, PopupTimeSelectionMode newValue)
 {
 }
        /// <summary>
        /// Called when a new Popup is set.
        /// </summary>
        /// <param name="popup">The new value.</param>
        private void RegisterPopup(TimePickerPopup popup)
        {
            if (popup != null)
            {
                if (PopupPlaceHolderPart != null)
                {
                    PopupPlaceHolderPart.Content = popup;
                }

                popup.TimePickerParent = this;

                if (!popup.GetValidPopupTimeSelectionModes().Contains(PopupTimeSelectionMode))
                {
                    // silently coerce
                    PopupTimeSelectionMode = popup.PopupTimeSelectionMode;
                }
            }
        }