Проблема привязки источника элементов данных WPF DataGrid - PullRequest
7 голосов
/ 07 марта 2011

У меня есть DataGrid в приложении WPF, которое связывает себя с ObservableCollection объектов, и все работает отлично. Теперь, если я изменю ячейку в сетке данных во время выполнения и удалю содержимое, оставьте ячейку пустой. Соответствующее значение observableCollection не будет изменено, оно будет старым значением. Но когда я выхожу из окна, содержащего сетку данных, и перезапускаю окно, оно выдает XamlParseException, которое говорит: «Задать свойство 'System.Windows.Controls.ItemsControl.ItemsSource' вызвала исключение"

  StackTrace:
       at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
       at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
       at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
       at VO3.Start.InitializeComponent() in c:\VO\Trunk\VO3\Start.xaml:line 1
       at VO3.Start..ctor() in C:\VO\Trunk\VO3\Start.xaml.cs:line 103
  InnerException: System.InvalidOperationException
       Message='DeferRefresh' is not allowed during an AddNew or EditItem transaction.
       Source=PresentationFramework
       StackTrace:
            at System.Windows.Data.CollectionView.DeferRefresh()
            at System.Windows.Controls.ItemCollection.SetCollectionView(CollectionView view)
            at System.Windows.Controls.ItemCollection.SetItemsSource(IEnumerable value)
            at System.Windows.Controls.ItemsControl.OnItemsSourceChanged(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.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
            at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
            at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value)
            at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)
            at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)
       InnerException: 

Это исключение не возникнет, пока я закрываю окно, ни одна ячейка в сетке данных не пуста. Я также проверил коллекцию до того, как Window выполнит строку InitializeComponent, и она выглядит отлично, все объекты имеют правильное значение, не пустые и не равны нулю. Я не могу понять, почему он выбрасывает это исключение. есть идеи? Заранее спасибо.

XAML:

<DataGrid HeadersVisibility="All" RowHeight="19" AutoGenerateColumns="False" Grid.Row="1" CanUserResizeColumns="False"
                              CanUserAddRows="False" CanUserDeleteRows="False" Block.TextAlignment="Right" Grid.RowSpan="2" CanUserReorderColumns="False"
                              ItemsSource="{Binding Collection}" Width="132" HorizontalAlignment="Right" Margin="10,0,10,0" CanUserSortColumns="False"
                              IsEnabled="{Binding ElementName=CheckBox, Path=SelectedIndex, Converter={StaticResource startEnabledConverter}}">

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Похоже, было довольно много проблем с DataGrid & DeferRefresh. Вот два соответствующих сообщения :

Общая рекомендация, по-видимому, состоит в том, чтобы изучить связанное представление DataGrid как IEditableCollectionView (которое будет вашим по умолчанию, поскольку ObservableCollection получает ListCollectionView во время связывания, когда в последний раз я смотрел) и проверить IsAddingNew & IsEditingItem, чтобы проверить, можно ли изменить Посмотреть. К таким модификациям относится DeferRefresh, который по сути является Disposable, используемым для пакетной модификации представлений.

Насколько я вижу, у вас проблема в том, что DataGrid находится в середине транзакции, или представление настроено на то, что это так, пока вы меняете ItemsSource (который изменит или полностью заменит связанное связанное представление). ). То, что вы очищаете ячейку, но она еще не изменяет базовые данные, подразумевает, что он начал редактирование (BeginEdit), но еще не зафиксировал (CommitEdit), что происходит при изменении ячейки по умолчанию.

То, что это происходит, когда вы закрываете и снова открываете окно, подразумевает, что сохраняется некоторое сохраненное состояние, которое все еще думает, что транзакция выполняется. Возможно, он все еще использует тот же ListCollectionView, что и раньше, и для него по-прежнему установлено значение IsEditingItem, равное true?

Исправление, скорее всего, обеспечит фиксацию всех изменений перед тем, как закрыть окно.

0 голосов
/ 15 августа 2011

если поле, которое вы закрываете, не относится к типу string, то оно может обновляться неправильно. Например,

, если это "int" и вы очищаете ячейку "int"свойство вашей модели представления не будет установлено.

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

...