/// <summary> /// Facilitates control over what tab is being entered, and whether it is okay to leave the last one. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void Entered(object sender, EventArgs e) { if (_blockEntrance) { return; } var casted = _prev as ITrackableWithSaving; //try to upcast to imply saveability var current = sender as ITrackable; if (casted == null || !casted.IsBeingWatched() || !casted.HasUnsavedChanges || _prev == current) { _prev = current; return; } _blockEntrance = true; _prev.Focus(); switch (_prev.RequestExit()) { case RequestExitResult.AllowAndSave: casted.SaveChanges(); _prev = current; break; case RequestExitResult.AllowWithoutSave: _prev = current; break; } _prev.Focus(); _blockEntrance = false; }