Ошибка при удалении строки из сетки данных Silverlight 5 - PullRequest
1 голос
/ 25 января 2012

У меня есть приложение Silverlight 4 (ria 1.0), которое было обновлено сегодня до Silverlight 5 (ria 1.0 sp2)

Теперь я получаю следующую ошибку при попытке удалить запись из сетки данных:

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 обернут в ObservableCollection, который привязан к сетке данных, поэтому при попытке удалить элемент из ObservableCollection я получаю эту ошибку.

Также я попытался привязать EntitySet напрямую к сетке данных и удалить элемент из EntitySet, но я все еще получаю ту же ошибку.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Как правило, вы всегда должны определять элементы управления для всех [TemplatePart] в пользовательском шаблоне, если в документации по элементу управления не указано, что вам это не нужно.Эти атрибуты [TemplatePart] предназначены для документирования частей кода, на которые может ссылаться элемент управления.Если элемент управления обнаруживает, что в его шаблоне отсутствуют важные части, он должен выдать исключение.Очевидно, что DataGrid в Silverlight 5 Toolkit этого не делает - возможно, Microsoft намеревается использовать его без вертикальной полосы прокрутки?

Класс Silverlight 5 DataGrid имеет поле _vScrollBar, в котором хранится вертикальныйПолоса прокрутки считывается из шаблона элемента управления, если он вообще есть в шаблоне.В методе OnRemovedElement я смог увидеть, что код читает свойство _vScrollBar.Maximum без предварительной проверки, является ли _vScrollBar нулевым.Я подозреваю, что именно отсюда выдается исключение NullReferenceException, которое вы видите.Я бы сказал, что это ошибка в DataGrid Silverlight 5: либо DataGrid должен жаловаться на то, что в шаблоне отсутствует вертикальная полоса прокрутки, либо он должен справиться без него.

1 голос
/ 26 января 2012

Я решил проблему.

Проблема заключалась в следующем: - наша сетка данных имеет собственный шаблон - наш шаблон был без VerticalScrollbar [TemplatePartAttribute (Name = "VerticalScrollbar", Type = typeof (ScrollBar))]

При удалении строк сетка данных пытается пересчитать высоты. Этот процесс включает VerticalScrollbar (даже думал, что он должен быть невидимым). Как только у меня не было полосы прокрутки в шаблоне, я получал исключение NullReferenceException. Я добавил VerticalScrollbar в шаблон сетки данных, и проблема была решена.

В Silverlight 4 все работало нормально. Поэтому у меня есть вопрос: является ли это дефектом сетки данных Silverlight 5? или я всегда должен определять все части шаблона в пользовательском шаблоне?

...