2009-03-27 4 views
4

Ich bekomme eine Ausnahme versuchen leer DataGrid Zeile.PowerShell WPF DataGrid: Exception ausgelöst committing leere Zeile

System.NullReferenceException: Object reference not set to an instance of an object. 
    at MS.Internal.Data.PropertyPathWorker.DetermineWhetherDBNullIsValid() 
    at MS.Internal.Data.PropertyPathWorker.get_IsDBNullValidForUpdate() 
    at MS.Internal.Data.ClrBindingWorker.get_IsDBNullValidForUpdate() 
    at System.Windows.Data.BindingExpression.ConvertProposedValue(Object value) 
    at System.Windows.Data.BindingExpressionBase.UpdateValue() 
    at System.Windows.Data.BindingExpression.Update(Boolean synchronous) 
    at System.Windows.Data.BindingExpression.UpdateSource() 
    at Microsoft.Windows.Controls.DataGridHelper.UpdateSource(FrameworkElement element, DependencyProperty dp) 
    at Microsoft.Windows.Controls.DataGridTextColumn.CommitCellEdit(FrameworkElement editingElement) 
    at Microsoft.Windows.Controls.DataGridColumn.CommitEdit(FrameworkElement editingElement) 
    at Microsoft.Windows.Controls.DataGridCell.CommitEdit() 
    at Microsoft.Windows.Controls.DataGrid.OnExecutedCommitEdit(ExecutedRoutedEventArgs e) 
    at Microsoft.Windows.Controls.DataGrid.OnExecutedCommitEdit(Object sender, ExecutedRoutedEventArgs e) 
    at System.Windows.Input.CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e) 
    at System.Windows.Input.CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding) 
    at System.Windows.Input.CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute) 
    at System.Windows.Input.CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute) 
    at System.Windows.Input.CommandManager.OnExecuted(Object sender, ExecutedRoutedEventArgs e) 
    at System.Windows.UIElement.OnExecutedThunk(Object sender, ExecutedRoutedEventArgs e) 
    at System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object target) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
    at System.Windows.Input.RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated) 
    at System.Windows.Input.RoutedCommand.Execute(Object parameter, IInputElement target) 
    at Microsoft.Windows.Controls.DataGrid.EndEdit(RoutedCommand command, DataGridCell cellContainer, DataGridEditingUnit editingUnit, Boolean exitEditMode) 
    at Microsoft.Windows.Controls.DataGrid.CommitEdit(DataGridEditingUnit editingUnit, Boolean exitEditingMode) 
    at Microsoft.Windows.Controls.DataGrid.CommitAnyEdit() 
    at Microsoft.Windows.Controls.DataGrid.OnEnterKeyDown(KeyEventArgs e) 
    at Microsoft.Windows.Controls.DataGrid.OnKeyDown(KeyEventArgs e) 
    at System.Windows.UIElement.OnKeyDownThunk(Object sender, KeyEventArgs e) 
    at System.Windows.Input.KeyEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
    at System.Windows.Input.InputManager.ProcessStagingArea() 
    at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
    at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
    at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey) 
    at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled) 
    at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers) 
    at System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
Exception calling "Run" with "1" argument(s): "Object reference not set to an instance of an object." 

Schritte zum Reproduzieren:

  • Goto "neue Zeile"
  • Press F2
  • Presse

ENTER Dies funktioniert ok:

  • Gehe zu "neue Zeile"
  • Press F2
  • ESC

Neben:

  • Goto "neue Zeile"
  • Press F2
  • Typ "sdfdsf"
  • Drücken Sie ENTER

Quellen können here gefunden werden.

Ich habe zwei Einträge gefunden, die zu diesem Problem verwandt zu sein scheint:

  1. Exception in .Net 3.5 SP1
  2. WPF Databinding, Class Types, No Namespace Exception

Auch habe ich versucht, einen ähnlichen Code in C#, und es funktionierte gut.

Wie kann ich dieses Problem beheben?

Antwort

2

Dies scheint ein Fehler in der Microsoft WPF Datagrid zu sein. Sie sollten es unbedingt über Microsoft Connect melden, wenn Sie dies noch nicht getan haben.

Als Abhilfe kann, können Sie einen Wert Konverter auf Ihren Bindungen verwenden, von NULL-Werte auf dem verbindliche Ziel zu stoppen, an die Bindungsquelle übertragen werden, die die Nullreferenceexception verursachen. Hier ist ein Beispiel eines solchen Wandlers:

// NullToUnsetConverter.cs  

using System; 
using System.Windows; 
using System.Windows.Data; 
using System.Globalization; 

namespace MyProject.Controls.Converters 
{ 
    /// <summary> 
    /// Converts <c>null</c> values to <see cref="DependencyProperty.UnsetValue"/>. 
    /// <remarks> 
    /// This converter is intented for use in situations when the binding target 
    /// does not correctly handle <c>null</c> values. This is the case for example 
    /// with some WPF UI controls. 
    /// </remarks> 
    /// </summary> 
    public class NullToUnsetConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value == null) 
      { 
       return DependencyProperty.UnsetValue; 
      } 
      else 
      { 
       // No conversion applied 
       return value; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // No conversion applied 
      return value; 
     } 
    } 
} 

Um den Konverter an Ihre Bindungen anwenden, werden Sie Ihre XAML wie dieses ändern:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cnv="clr-namespace:MyProject.Controls.Converters" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit" 
    > 

    <Window.Resources> 
    <x:Array x:Key="people" Type="sys:Object" /> 
    <cnv:NullToUnsetConverter x:Key="NullToUnsetConverter" /> 
    </Window.Resources> 

    <StackPanel> 
    <dg:DataGrid ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False"> 
     <dg:DataGrid.Columns> 

     <dg:DataGridTextColumn Header="First" Binding="{Binding First, Converter={StaticResource NullToUnsetConverter}}" /> 
     <dg:DataGridTextColumn Header="Last" Binding="{Binding Last, Converter={StaticResource NullToUnsetConverter}}" /> 

     </dg:DataGrid.Columns> 
    </dg:DataGrid> 
    </StackPanel> 
</Window> 

Alternativ könnten Sie das ändern NullToUnsetConverter.Convert Methode, um eine leere Zeichenfolge zurückgeben, wenn der Eingabewert eine Zeichenfolge ist, wie in Ihrem Fall.