2009-10-12 4 views
0

Mon application utilise un WPF DataGrid. L'une des colonnes est une colonne modèle contenant un ComboBox lié à un ObservableCollection de l'entité qui alimente la ligne. Lorsque j'ajoute une valeur au ObservableCollection, un NullReferenceException est lancé.Pourquoi ObservableCollection génère-t-il une exception lors de sa modification?

Est-ce que quelqu'un a une idée pourquoi cela se produit? Voici la trace de pile de l'exception:

 
    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.BindingExpressionBase.Dirty() 
    at System.Windows.Data.BindingExpression.SetValue(DependencyObject d, DependencyProperty dp, Object value) 
    at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal) 
    at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) 
    at System.Windows.Controls.Primitives.Selector.UpdatePublicSelectionProperties() 
    at System.Windows.Controls.Primitives.Selector.SelectionChanger.End() 
    at System.Windows.Controls.Primitives.Selector.OnItemsChanged(NotifyCollectionChangedEventArgs e) 
    at System.Windows.Controls.ItemsControl.OnItemCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Controls.ItemCollection.System.Windows.IWeakEventListener.ReceiveWeakEvent(Type managerType, Object sender, EventArgs e) 
    at System.Windows.WeakEventManager.DeliverEventToList(Object sender, EventArgs args, ListenerList list) 
    at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args) 
    at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex) 
    at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item) 
    at System.Collections.ObjectModel.Collection`1.Add(T item) 
    at ORF.PersonBook.IdentityModule.Model.SubsidiaryModel.AddRoom(RoomModel room) in C:\Project\Phoenix\Development\src\ORF.PersonBook.IdentityModule\Model\SubsidiaryModel.cs:line 127 
+0

pouvez-vous donner un exemple pour reproduire le problème? – japf

+0

Je souhaite que je pourrais mais j'ai essayé et ne pourrais pas le reproduire dans une petite application de test: S –

Répondre

9

Enfin, j'ai trouvé la raison de l'exception. Le problème se produit lorsque vous supprimez l'élément sélectionné de la liste. Ci-dessous j'ai posté un morceau de code incomplet.

<!-- XAML --> 
<ListBox ItemsSource="{Binding Rooms}" SelectedItem="{Binding SelectedRoom}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <DockPanel> 
       <Button Content="remove" DockPanel.Dock="Right" Command="{Binding Some Remove Command}" /> 
       <TextBlock Text="{Binding Name}" /> 
      </DockPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

et le modèle de vue:

// View Model 
public ObservableCollection<Room> Rooms { get; private set; } 
public Room SelectedRoom { get; set; } 

public RemoveRoom() 
{ 
    var room = SelectedRoom; 
    //SelectedRoom = null; // Uncomment this line to avoid the exception 

    Rooms.Remove(room); 
} 

La solution est d'abord configurer l'élément sélectionné à null (ou tout autre objet) avant d'enlever en fait l'élément de la liste.

Oliver Hanappi

0

Votre objet de classe Room est-il réellement instancié? Il semble que vous ajoutiez une valeur non initialisée.

+1

La pièce n'est pas nulle et bien que l'exception soit levée, les collections contiennent la pièce, ainsi il semble que la liaison de données les événements de ObservableCollection <>) provoquent l'exception. Malheureusement, je ne peux pas savoir où, mais je vais essayer de déboguer la liaison de données en définissant son niveau de trace à haute. –

+0

@OliverHanappi, oh, je t'aime Oliver, tu m'as sauvé la vie! C'est la liaison de données qui provoque cette exception! –

Questions connexes