2013-02-22 10 views
5

Ich habe eine DataGrid Anzeige mehrerer Zeilen und Spalten von Daten, jedes ist an seine eigene Property gebunden. Die DataGrid ist NICHT auf TabControl, aber immer wenn das Fenster, auf dem es lebt, geschlossen und wieder geöffnet wird, erhalte ich die Fehlermeldung: NUR WENN gab es Validierungen Probleme mit einer oder mehreren DataGrid 's Zellen.WPF DataGrid nicht beenden Bearbeitungsmodus

Zum Beispiel: Die Eigenschaft gebunden an die DataGrid ‚s cell ist ein double und der Benutzer gibt‚Hallo‘, dann natürlich WPF's automatischen roten Rand um die cell angezeigt. Wenn der Benutzer das Fenster jetzt schließen und erneut öffnen würde, würde der Fehler auftreten.

Ich weiß, warum der Fehler geworfen wird, weil die cell nicht "Bearbeitungsmodus" verlassen.

Wie kann ich diesen Fehler beheben?

Weitere Informationen:

  • Ich habe bei this question aussehen, aber das ist im Zusammenhang mit einem DataGrid auf einem TabControl (die Mine nicht ist).
  • Ich habe versucht, die Benutzereingabe zu begrenzen, so dass wenn die Cell erfordert double oder dann nur eine double akzeptieren, aber das Problem ist, gibt es keine guten Möglichkeiten, die Anzahl der Dezimalstellen ("."), Dass der Benutzer zu begrenzen kann einfügen. Ich kontrolliere Benutzereingabe durch PreviewTextInput und erlaube nur 0-9 und ".".

Exception Details (wenn das hilft)

System.InvalidOperationException was unhandled 
    Message='DeferRefresh' is not allowed during an AddNew or EditItem transaction. 
    Source=PresentationFramework 
    StackTrace: 
     at System.Windows.Data.CollectionView.DeferRefresh() 
     at System.Windows.Controls.ItemCollection.SetCollectionView(CollectionView view) 
     at System.Windows.Controls.ItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
     at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
     at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
     at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) 
     at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange) 
     at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) 
     at System.Windows.Data.BindingExpression.Activate(Object item) 
     at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt) 
     at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance) 
     at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) 
     at MS.Internal.Data.DataBindEngine.Run(Object arg) 
     at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e) 
     at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() 
     at System.Windows.ContextLayoutManager.UpdateLayout() 
     at System.Windows.Interop.HwndSource.SetLayoutSize() 
     at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value) 
     at System.Windows.Window.SetRootVisualAndUpdateSTC() 
     at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight) 
     at System.Windows.Window.CreateSourceWindow(Boolean duringShow) 
     at System.Windows.Window.ShowHelper(Object booleanBox) 
     at REACT.ViewModel.ReceiverListViewModel.ShowWindow(String name) in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\ViewModel\ReceiverListViewModel.cs:line 238 
     at REACT.Commands.ShowWindowCommand.Execute(Object parameter) in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\Commands.cs:line 137 
     at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) 
     at System.Windows.Controls.Button.OnClick() 
     at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
     at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
     at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
     at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
     at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
     at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
     at System.Windows.Application.RunInternal(Window window) 
     at System.Windows.Application.Run() 
     at REACT.App.Main() in C:\Users\jcarroll42\Documents\Sandbox\REACT\SW\Source\obj\x86\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Ich werde glücklich sein, mehr Informationen zur Verfügung zu stellen, wenn nötig.

+0

Verwenden Sie jedes Mal eine neue Window/datagrid-Instanz? – Liju

+0

@Liju Ja, ich bin. –

+1

Ich löste ein ähnliches Problem durch den Aufruf von buttonBlah.Focus() innerhalb des Window Closing-Ereignisses, wodurch das LostFocus-Ereignis auf die Zelle ausgelöst wird. Nicht schön, ich weiß ... Eine andere Lösung besteht darin, das Fenster nur mit den Schaltflächen "Speichern" und "Abbrechen" zu schließen. – Jack

Antwort

5

Dies ist ein Fehler, der mit .NET Framework 4.5 + behoben wurde. Leider, für diejenigen von uns mit früheren Versionen fest, der Fehler ist immer noch ein Problem. Die beste Lösung, die ich gefunden habe, ist, einfach die DataGrid an properties mit Typ string zu binden. Auf diese Weise ist eine vollständige Kontrolle über Benutzereingaben möglich. Bei voller Kontrolle sollte der Benutzer keine Fehler auslösen können und das DataGrid wird das Programm nicht zum Absturz bringen.

+0

Ich habe genau dieses Problem mit .NET 4.5.1. – l33t

+0

@ l33t Immer reparieren? Ich betreibe auch .NET 4.5 und sehe das immer noch. – MarqueIV

+2

@ Jordan, können Sie mit dem Dokument verlinken, das anzeigt, wann genau dies behoben wurde? War es in 4.5 oder 4.5.1, 4.5.2 usw.? Ich konnte bei den Suchanfragen nichts finden, dass es überhaupt angesprochen wurde, geschweige denn behoben. – MarqueIV

8

können Sie versuchen, Datenraster zu zwingen, in die Ausgabe Cancelling wenn Sie es brauchen:

myDatagrid.CommitEdit(); 
myDatagrid.CancelEdit(); 

Das ist für mich gearbeitet, ich ein ähnliches Problem hatte, als Reihen-Neuordnungs.

+1

Wo haben Sie diesen Code? Ich habe versucht, es auf das Ereignis durch den Knopf ausgelöst gesetzt zu erhöhen um das Fenster zu schließen, aber es löst das Problem nicht für mich – FrancescoDS

+0

@FrancescoDS Hey ich hatte ein ähnliches Problem, und der Fehler wurde von einer DataGrid.ItemsSource = Daten ausgelöst, Linie.Ich lege es buchstäblich direkt vor der Zeile, die war den Fehler verursacht und es funktionierte für mich - für mich wurde es durch einen fehlerhaften Doppelklick auf eine Zelle im Datagrid verursacht (der Doppelklick ließ das Programm glauben, dass der Benutzer versuchte, den Inhalt einer Zelle zu bearbeiten, aber das war nicht der Absicht der Nutzer) – ajivani