我有一个Silverlight 4(ria 1.0)应用程序,今天已升级为Silverlight 5(ria 1.0 sp2)
现在,当我试图从数据网格中删除记录时,我得到了以下错误:
位于System.Windows.Controls.DataGrid.OnRemovedElement(Int32 slotDeleted,Object itemDeleted,Boolean isRow)位于System.Windows.Controls.DataGrid.RemoveElementAt(Int32插槽,对象项,布尔isRow)位于System.Windows.Controls.DataGrid.RemoveRowAt(Int32 rowIndex,Object项)位于System.Windows.Controls.DataGridDataConnection.NotifyingDataSource_CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)位于System.Windows.Controls.DataGridDataConnection。<WireEvents>b__0(DataGridDataConnection实例,对象源,NotifyCollectionChangedEventArgs事件Args)位于System.Windows.Controls.WeakEventListener`3.OnEvent(TSource源,TEventArgs eventArgs)位于System.Windows.Data.PagedCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs参数)位于System.Windows.Data.PagedCollectionView.ProcessRemoveEvent(对象removedItem,布尔值为Replace)位于System.Windows.Data.PagedCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs参数)位于System.Windows.Data.PagedCollectionView.<。ctor>b__0(对象发送方,NotifyCollectionChangedEventArgs参数)位于System.Collections.ObjectModel.ObsObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)位于System.Collections.ObjectModel.ObsObservableCollection`1.RemoveItem(Int32索引)位于System.Collections.ObjectModel.Collection`1.Remove(T项)位于Allscripts.UECPortal.Client.Modules.PayerpathEnrollmentProfile.ViewModels.CompleteUserInformation.CompleteUserInformationViewModel.deleteUserCommandExcated(对象参数)位于Microsoft.Practices.Prism.Commands.DelegateCommand`1.<gt;c_DisplayClass6.<。ctor>b_2(对象o)位于Microsoft.Practices.Prism.Commands.DelegateCommandBase.Execute(对象参数)位于Microsoft.Practices.Prism.Commands.DelegateCommandBase.System.Windows.Input.ICommand.Execute(对象参数)位于System.Windows.Controls.Primitives.ButtonBase.ExecuteCommand()位于System.Windows.Controls.Primitives.ButtonBase.OnClick()位于System.Windows.Controls.Primitives。ToggleButton.OnClick()位于System.Windows.Controls.Primities.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)在System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl,EventArgs e)位于MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj、IntPtr unmanagedObjArgs、Int32 argsTypeIndex、Int32 actualArgsTypeIndex,String eventName,UInt32标志)
我将DomainContext.EntitySet封装到绑定到数据网格的ObservableCollection中,所以当我试图从ObservableCollections中删除项目时,我会收到这个错误。
此外,我还尝试将EntitySet直接绑定到数据网格,并从EntitySet中删除项,但仍然会遇到同样的错误。
通常,您应该始终为自定义模板中的所有[TemplatePart]
定义控件,除非控件的文档中说您不必这样做。这些[TemplatePart]
属性的目的是记录控件可能引用的代码部分。如果控件发现其模板缺少重要部分,则应抛出异常。显然,Silverlight 5工具包中的DataGrid并没有做到这一点——也许微软打算在没有垂直滚动条的情况下使用它?
Silverlight 5 DataGrid
类有一个字段_vScrollBar
,用于存储从控件模板读取的垂直滚动条(如果模板中有)。在OnRemovedElement
方法中,我能够看到代码读取_vScrollBar.Maximum
属性,而无需首先检查_vScrollBar
是否为null。我怀疑这就是您看到的NullReferenceException被抛出的地方。我想说这是Silverlight 5 DataGrid中的一个错误:要么DataGrid应该抱怨模板中没有垂直滚动条,要么它应该在没有滚动条的情况下处理。
我已经解决了一个问题。
问题如下:-我们的数据网格有自定义模板-我们的模板没有VerticalScrollbar[TemplatePartAttribute(Name="VerticalScrllbar",Type=typeof(ScrollBar))]
在行删除数据网格时,会尝试重新计算高度。这个过程涉及垂直滚动条(甚至认为它应该是不可见的)。当我还没有在模板中滚动条时,我就得到了NullReferenceException。我将VerticalScrollbar添加到数据网格模板中,问题得到了解决。
在Silverlight 4中,一切都正常。所以我有一个问题:这是Silverlight 5数据网格的缺陷吗?或者我应该始终在自定义模板中定义所有模板部件?