J'ai une application simple qui lit une liste d'albums à partir d'une base de données et remplit un ListBox (AlbumShowCase). Chaque fois qu'un ListBoxItem est sélectionné, je mets à jour un DataGrid (trackDataGrid) avec la liste des pistes dans cet Album (également à partir de la DataBase).Modification d'un DataGrid dans WPF provoque une exception System.NullReferenceException
Le problème est que je peux éditer les éléments dans le DataGrid, et pour toutes les pistes existantes, les modifications sont persistantes. Mais si j'essaie d'ajouter une nouvelle piste, une fois que j'ai fini d'éditer la ligne, j'obtiens l'exception System.NullReferenceException.
private TunesDBDataContext db;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
db = new TunesDBDataContext("TunesDB.sdf");
var query = from a in db.Albums select new AlbumCase(a);
AlbumShowCase.ItemsSource = query;
}
private void trackDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
db.SubmitChanges();
}
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var query = from a in db.Albums
where a.AlbumID == ((AlbumCase)e.AddedItems[0]).Album.AlbumID
select a.Tracks;
trackDataGrid.ItemsSource = query;
}
L'exception se produit juste après mon ValueConverter:
[ValueConversion(typeof(String), typeof(int))]
public class TimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int time = (int)value;
TimeSpan ts = TimeSpan.FromSeconds(time);
return ts.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// The validation runs before this, so we know that if we got here
// the data must be valid and won't throw an exception.
return (int)TimeSpan.Parse((string)value).TotalSeconds;
// THE EXCEPTION OCCURS AFTER THIS LINE FOR NEW ROWS
}
Le TimeConverter est jumelé à un TimeConverterRule qui fait que la longueur de la piste entré est valide, et pour tout ce que je sais que ça fonctionne très bien. C'est juste lorsque l'utilisateur édite la dernière ligne (la case vide) du DataGrid que le plantage se produit. Et voici la trace de la pile:
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=PresentationFramework
StackTrace:
at System.Windows.Data.BindingExpression.IsValidValueForUpdate(Object value, Type sourceType)
at System.Windows.Data.BindingExpression.ConvertProposedValue(Object value)
at System.Windows.Data.BindingExpression.ValidateAndConvertProposedValue(Collection1& values)
at System.Windows.Controls.DataGridHelper.ValidateWithoutUpdate(FrameworkElement element)
at System.Windows.Controls.DataGridColumn.CommitCellEdit(FrameworkElement editingElement)
at System.Windows.Controls.DataGridColumn.CommitEdit(FrameworkElement editingElement)
at System.Windows.Controls.DataGridCell.CommitEdit()
at System.Windows.Controls.DataGrid.OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
at System.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 System.Windows.Controls.DataGrid.EndEdit(RoutedCommand command, DataGridCell cellContainer, DataGridEditingUnit editingUnit, Boolean exitEditMode)
at System.Windows.Controls.DataGrid.CommitAnyEdit()
at System.Windows.Controls.DataGrid.OnEnterKeyDown(KeyEventArgs e)
at System.Windows.Controls.DataGrid.OnKeyDown(KeyEventArgs e)
etc...etc...
}
Je veux voir la déclaration XAML – ebattulga