从Silverlight 5数据网格中删除行时出错

时间:2012-01-25 19:41:25

标签: silverlight datagrid wcf-ria-services observablecollection entityset

我有一个Silverlight 4(ria 1.0)应用程序,今天升级到Silverlight 5(ria 1.0 sp2)

现在,当我尝试从datagrid删除记录时,我收到以下错误:

at System.Windows.Controls.DataGrid.OnRemovedElement(Int32 slotDeleted, Object   itemDeleted, Boolean isRow)
at System.Windows.Controls.DataGrid.RemoveElementAt(Int32 slot, Object item, Boolean isRow)
at System.Windows.Controls.DataGrid.RemoveRowAt(Int32 rowIndex, Object item)
at System.Windows.Controls.DataGridDataConnection.NotifyingDataSource_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Windows.Controls.DataGridDataConnection.<WireEvents>b__0(DataGridDataConnection instance, Object source, NotifyCollectionChangedEventArgs eventArgs)
at System.Windows.Controls.WeakEventListener`3.OnEvent(TSource source, TEventArgs eventArgs)
at System.Windows.Data.PagedCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
at System.Windows.Data.PagedCollectionView.ProcessRemoveEvent(Object removedItem, Boolean isReplace)
at System.Windows.Data.PagedCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
at System.Windows.Data.PagedCollectionView.<.ctor>b__0(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)
at Allscripts.UECPortal.Client.Modules.PayerpathEnrollmentProfile.ViewModels.CompleteUserInformation.CompleteUserInformationViewModel.deleteUserCommandExcuted(Object parameter)
at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__2(Object o)
at Microsoft.Practices.Prism.Commands.DelegateCommandBase.Execute(Object parameter)
at Microsoft.Practices.Prism.Commands.DelegateCommandBase.System.Windows.Input.ICommand.Execute(Object parameter)
at System.Windows.Controls.Primitives.ButtonBase.ExecuteCommand()
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Primitives.ToggleButton.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)

我将DomainContext.EntitySet包装到绑定到datagrid的ObservableCollection中,因此当我尝试从ObservableCollection中删除项时,我收到此错误。

此外,我尝试将EntitySet直接绑定到datagrid,并从EntitySet中删除项目,我仍然得到相同的错误。

2 个答案:

答案 0 :(得分:2)

通常,您应始终为自定义模板中的所有[TemplatePart]定义控件,除非控件的文档说明您不需要。这些[TemplatePart]属性的意图是记录控件可能引用的代码部分。如果控件发现其模板缺少必要部分,则应抛出异常。很明显,Silverlight 5 Toolkit中的DataGrid不会这样做 - 也许Microsoft打算在没有垂直滚动条的情况下使用它?

Silverlight 5 DataGrid类有一个字段_vScrollBar,它存储从控件模板中读取的垂直滚动条(如果模板中有一个)。在OnRemovedElement方法中,我能够看到代码读取_vScrollBar.Maximum属性,而不首先检查_vScrollBar是否为空。我怀疑这是你正在看到的NullReferenceException被抛出的地方。我想说这是Silverlight 5 DataGrid中的一个错误:DataGrid应该抱怨模板中没有垂直滚动条,或者它应该没有处理。

答案 1 :(得分:1)

我已经解决了一个问题。

问题如下:    - 我们的数据网格有自定义模板    - 我们的模板没有VerticalScrollbar [TemplatePartAttribute(Name =“VerticalScrollbar”,Type = typeof(ScrollBar))]

在行上删除datagrid会尝试重新计算高度。这个过程涉及VerticalScrollbar(甚至认为它应该是不可见的)。只要我没有在模板中滚动条,我就会得到NullReferenceException。 我将VerticalScrollbar添加到datagrid模板并解决了问题。

在Silverlight 4中,一切正常。所以我有一个问题:这是Silverlight 5数据网格缺陷吗?或者我应该总是在自定义模板中定义所有模板部件?