2011-05-01 90 views
4

調用remove操作的代碼通常可以正常工作,這是我第一次接收到NullReferenceException。我試圖弄清楚我是否可能做錯了什麼,以及是否可以避免異常,以使軟件更加符合防彈要求。WPF ObservableCollection.Remove throws NullReferenceException

相對來說,大量的System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren調用也顯得有點時髦。

任何幫助將不勝感激。

OS:6.1.7600.0 .NET:4.0.30319.225

堆棧:

at System.Windows.DependencyPropertyChangedEventArgs.get_OldValue() 
at System.Windows.Controls.Control.OnTemplateChanged(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.DependencyObject.InvalidateProperty(DependencyProperty dp) 
at System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1_ exclusionContainerDependents, FrugalStructList`1_ oldContainerDependents, FrugalStructList`1_ newContainerDependents) 
at System.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle) 
at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style_ styleCache) 
at System.Windows.FrameworkElement.OnStyleChanged(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.DependencyObject.InvalidateProperty(DependencyProperty dp) 
at System.Windows.FrameworkElement.UpdateStyleProperty() 
at System.Windows.FrameworkElement.InvalidateTreeDependentProperties(TreeChangeInfo parentTreeState, Boolean isSelfInheritanceParent) 
at System.Windows.FrameworkElement.OnAncestorChangedInternal(TreeChangeInfo parentTreeState) 
at System.Windows.TreeWalkHelper.OnAncestorChanged(DependencyObject d, TreeChangeInfo info) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d) 
at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe) 
at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d) 
at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 
at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d) 
at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode) 
at MS.Internal.PrePostDescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode) 
at System.Windows.TreeWalkHelper.InvalidateOnTreeChange(FrameworkElement fe, FrameworkContentElement fce, DependencyObject parent, Boolean isAddOperation) 
at System.Windows.FrameworkElement.OnVisualParentChanged(DependencyObject oldParent) 
at System.Windows.Controls.ListBoxItem.OnVisualParentChanged(DependencyObject oldParent) 
at System.Windows.Media.Visual.FireOnVisualParentChanged(DependencyObject oldParent) 
at System.Windows.Media.Visual.RemoveVisualChild(Visual child) 
at System.Windows.Media.VisualCollection.DisconnectChild(Int32 index) 
at System.Windows.Media.VisualCollection.RemoveRange(Int32 index, Int32 count) 
at System.Windows.Controls.UIElementCollection.RemoveRangeInternal(Int32 index, Int32 count) 
at System.Windows.Controls.VirtualizingStackPanel.RemoveChildRange(GeneratorPosition position, Int32 itemCount, Int32 itemUICount) 
at System.Windows.Controls.VirtualizingStackPanel.OnItemsRemove(ItemsChangedEventArgs args) 
at System.Windows.Controls.VirtualizingStackPanel.OnItemsChanged(Object sender, ItemsChangedEventArgs args) 
at System.Windows.Controls.VirtualizingPanel.OnItemsChangedInternal(Object sender, ItemsChangedEventArgs args) 
at System.Windows.Controls.Panel.OnItemsChanged(Object sender, ItemsChangedEventArgs args) 
at System.Windows.Controls.ItemContainerGenerator.OnItemRemoved(Object item, Int32 itemIndex) 
at System.Windows.Controls.ItemContainerGenerator.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
at System.Windows.Controls.ItemContainerGenerator.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.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.RemoveItem(Int32 index) 
at System.Collections.ObjectModel.Collection`1.Remove(T item) 
+0

請問您可以添加一些代碼,負責刪除 – Homam 2011-05-01 09:28:23

+0

謝謝霍曼。除了MyCollection.Remove(item)之外,我可以發佈的內容並不多。你爲什麼認爲這可能會有所作爲?在這種情況下,整個堆棧是直接.NET。 – sagibb 2011-05-01 09:51:11

回答

1

我在堆棧跟蹤發現許多調用OnPropertyChanged的指示代碼發射了數PropertyChanged更改事件。如果代碼中某處存在對ObservableCollection中某個對象的引用,那麼如果代碼嘗試使用該對象,則可能會得到一個NullReferenceException。

因爲您指出這種情況並不頻繁,所以我猜測根據堆棧跟蹤中XAML中的一個控件(查看InvalidateOnTreeChange)中的選定項目來引用已刪除項目。

我在這裏包含了一段代碼片斷,它顯示了對選定項目的引用如何引發NullReferenceException。在我的示例中,我有一個DataGrid綁定到Customer對象的ObservableCollection,並跟蹤其選定的項目。當代碼從ObservableCollection中移除選定的客戶時,代碼觸發PropertyChanged事件,導致DataGrid刷新其選中的項目,該項目現在爲空。在示例中,因爲我嘗試更新所選項目的屬性,所以我得到一個NullReferenceException。我確信你的代碼更復雜,但我希望這有助於。

<!-- displays a list of customers and tracks the selected customer --> 
<DataGrid ItemsSource="{Binding Customers}" SelectedItem="{Binding Customer}"> 

<!-- command that removes an item from the collection --> 
<Button Grid.Column="1" Content="Remove" Command="{Binding Path=RemovePerson}"/>  

// ItemsSource of customers 
private ObservableCollection<Customer> _customers = Customer.GetSampleCustomerList(); 
public ObservableCollection<Customer> Customers 
{ 
    get 
    { 
    return _customers; 
    } 
} 

// selected customer from XAML SelectedItem 
private Customer _customer = null; 
public Customer Customer 
{ 
    get { return _customer; } 
    set 
    { 
    _customer = value; 

    // if i don't check for null here removing a customer causes a NullReferenceException 
    if (_customer != null) 
    { 
     if (_customer.Factor != 0) 
     { 
     _customer.Factor = 0; 
     } 
     else 
     { 
     _customer.Factor = 1; 
     } 
    } 
    } 
} 

// the button command ends up here to remove the selected item 
public ICommand RemovePerson { get; set; } 
private void OnRemovePerson(object obj) 
{ 
    if (_customers.Contains(_customer)) 
    { 
    Customers.Remove(_customer); 
    } 
} 
0

這看起來像視覺部分或數據綁定的一些問題,而不是ObservableCollection。

嘗試刪除所有綁定,然後慢慢添加它們以查明問題並告訴我們會發生什麼。

0

有同樣的問題。事實證明,我有((DataGrid)sender).BeginEdit()在錯誤發生之前的某個地方。該代碼片段保持對數據網格綁定到的集合值的引用。因此,並試圖用BindingCollection[index] = newValue;拋出一個NullReferenceException來更改其中一個值。我不得不刪除begin_edit。

相關問題