2011-05-01 82 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。

相关问题