diff --git a/src/Eto.Wpf/Forms/Cells/CustomCellHandler.cs b/src/Eto.Wpf/Forms/Cells/CustomCellHandler.cs
index f6b4ed3659..95a289c79f 100755
--- a/src/Eto.Wpf/Forms/Cells/CustomCellHandler.cs
+++ b/src/Eto.Wpf/Forms/Cells/CustomCellHandler.cs
@@ -135,7 +135,7 @@ EtoBorder Create(swc.DataGridCell cell)
 				return control;
 			}
 
-			private void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e)
+			static void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e)
 			{
 				var ctl = sender as sw.FrameworkElement;
 				var cell = ctl?.GetVisualParent<swc.DataGridCell>();
@@ -152,24 +152,28 @@ private void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e)
 				}
 			}
 
-			void HandleIsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e)
+			static void HandleIsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e)
 			{
-				var h = Handler;
-				var ctl = sender as sw.FrameworkElement;
-				var cell = ctl?.GetVisualParent<swc.DataGridCell>();
+				var ctl = sender as EtoBorder;
+				var cell = ctl?.GetParent<swc.DataGridCell>();
+				var col = cell?.Column as Column;
+				var handler = col?.Handler;
+				if (handler == null)
+					return;
+
 				var isEditing = ctl.IsKeyboardFocusWithin || cell.IsEditing;
-				var args = GetEditArgs(cell, ctl);
+				var args = GetEditArgs(handler, cell, ctl);
 				if (args?.IsEditing != isEditing)
 				{
 					args.SetIsEditing(isEditing);
 					//cell.IsEditing = isEditing;
 					if (isEditing)
 					{
-						h.Callback.OnBeginEdit(h.Widget, args);
+						handler.Callback.OnBeginEdit(handler.Widget, args);
 					}
 					else {
-						h.Callback.OnCommitEdit(h.Widget, args);
-						h.ContainerHandler.CellEdited(h, ctl);
+						handler.Callback.OnCommitEdit(handler.Widget, args);
+						handler.ContainerHandler.CellEdited(handler, ctl);
 					}
 				}
 			}
@@ -276,7 +280,11 @@ static void HandleControlUnloaded(object sender, sw.RoutedEventArgs e)
 				var wpfctl = sender as EtoBorder;
 				var ctl = wpfctl.Control;
 				if (ctl != null && ctl.Loaded)
+				{
+					// clear out the context to remove any bindings
+					wpfctl.DataContext = null;
 					ctl.DetachNative();
+				}
 			}
 
 			static void HandleCellSelectedChanged(object sender, sw.RoutedEventArgs e)
@@ -311,7 +319,7 @@ protected override object PrepareCellForEdit(sw.FrameworkElement editingElement,
 				var obj = base.PrepareCellForEdit(editingElement, editingEventArgs);
 				var handler = Handler;
 				var cell = editingElement?.GetParent<swc.DataGridCell>();
-				var args = GetEditArgs(cell, editingElement);
+				var args = GetEditArgs(handler, cell, editingElement);
 				if (handler != null && args != null)
 				{
 					args.SetIsEditing(true);
@@ -326,9 +334,8 @@ protected override object PrepareCellForEdit(sw.FrameworkElement editingElement,
 				return obj;
 			}
 
-			WpfCellEventArgs GetEditArgs(swc.DataGridCell cell, FrameworkElement editingElement)
+			static WpfCellEventArgs GetEditArgs(CustomCellHandler handler, swc.DataGridCell cell, FrameworkElement editingElement)
 			{
-				var handler = Handler;
 				if (handler == null)
 					return null;
 				var ctl = editingElement as EtoBorder;
@@ -347,7 +354,7 @@ protected override bool CommitCellEdit(sw.FrameworkElement editingElement)
 				var result = base.CommitCellEdit(editingElement);
 				var handler = Handler;
 				var cell = editingElement?.GetParent<swc.DataGridCell>();
-				var args = GetEditArgs(cell, editingElement);
+				var args = GetEditArgs(handler, cell, editingElement);
 				if (handler != null && args != null)
 				{
 					args.SetIsEditing(false);
@@ -369,7 +376,7 @@ protected override void CancelCellEdit(sw.FrameworkElement editingElement, objec
 			{
 				var handler = Handler;
 				var cell = editingElement?.GetParent<swc.DataGridCell>();
-				var args = GetEditArgs(cell, editingElement);
+				var args = GetEditArgs(handler, cell, editingElement);
 				if (handler != null && args != null)
 				{
 					args.SetIsEditing(false);
diff --git a/src/Eto/Forms/Binding/ObjectBinding.cs b/src/Eto/Forms/Binding/ObjectBinding.cs
old mode 100644
new mode 100755
index cf24de0f7e..f513eca638
--- a/src/Eto/Forms/Binding/ObjectBinding.cs
+++ b/src/Eto/Forms/Binding/ObjectBinding.cs
@@ -144,18 +144,6 @@ public ObjectBinding(T dataItem, IndirectBinding<TValue> innerBinding)
 		{
 			this.dataItem = dataItem;
 			InnerBinding = innerBinding;
-			InnerBinding.Changed += HandleInnerBindingChanged;
-			InnerBinding.Changing += HandleInnerBindingChanging;
-		}
-
-		void HandleInnerBindingChanging(object sender, BindingChangingEventArgs e)
-		{
-			OnChanging(e);
-		}
-
-		void HandleInnerBindingChanged(object sender, BindingChangedEventArgs e)
-		{
-			OnChanged(e);
 		}
 
 		/// <summary>
@@ -173,7 +161,12 @@ public override TValue DataValue
 			}
 			set
 			{
+				var args = new BindingChangingEventArgs(DataValue);
+				OnChanging(args);
+				if (args.Cancel)
+					return;
 				InnerBinding.SetValue(DataItem, Equals(value, default(T)) ? SettingNullValue : value);
+				OnChanged(new BindingChangedEventArgs(DataValue));
 			}
 		}