/// <summary>
        /// Unbinds the binding source and the Data object. Use this Method to safely disconnect the data object from a BindingSource before saving data.
        /// </summary>
        /// <param name="source">The source.</param>
        /// <param name="cancel">if set to <c>true</c> then call CancelEdit else call EndEdit.</param>
        /// <param name="isRoot">if set to <c>true</c> this BindingSource contains the Root object. Set to <c>false</c> for nested BindingSources</param>
        public static void UnbindBindingSource(BindingSource source, bool cancel, bool isRoot)
        {
            IEditableObject current = null;
            // position may be -1 if bindigsource is already unbound which results in Exception when trying to address current
            if ((source.DataSource != null) && (source.Position > -1)) {
                current = source.Current as IEditableObject;
            }

            // set Raise list changed to True
            source.RaiseListChangedEvents = false;
            // tell currency manager to suspend binding
            source.SuspendBinding();

            if (isRoot) source.DataSource = null;
            if (current == null) return;

            if (cancel)
            {
                current.CancelEdit();
            }
            else
            {
                current.EndEdit();
            }
        }