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(); @@ -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(); + var ctl = sender as EtoBorder; + var cell = ctl?.GetParent(); + 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(); - 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(); - 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(); - 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 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); } /// @@ -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)); } }