我有一个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中删除项目,我仍然得到相同的错误。
答案 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数据网格缺陷吗?或者我应该总是在自定义模板中定义所有模板部件?