WPF DataGrid ItemsSource 绑定(bind)问题

标签 wpf exception datagrid binding itemssource

我在 WPF 应用程序中有一个 DataGrid,它将自身绑定(bind)到对象的 ObservableCollection,一切正常。
现在,如果我在运行时修改数据网格中的单元格并删除内容,请将单元格留空。 observableCollection 对应的值不会被修改,会是旧值。但是当我退出包含数据网格的窗口并重新启动窗口时,它会引发 XamlParseException,说:“Set Property 'System.Windows.Controls.ItemsControl.ItemsSource' throw an exception”

  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 Line 之前检查了 Collection,它看起来非常好,所有对象都有正确的值,没有空值或空值。我无法弄清楚为什么它会抛出这个异常。有任何想法吗?
提前致谢。

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}}">

最佳答案

DataGrid 和 DeferRefresh 似乎存在很多问题。这里有两个relevant posts :

一般建议似乎是将 DataGrid 的关联 View 作为 IEditableCollectionView 进行检查(默认情况下,您的 View 将是默认情况下,因为 ObservableCollection 在我上次查看时在绑定(bind)期间获取 ListCollectionView)并检查 IsAddingNew 和 IsEditingItem 以查看修改 View 是否安全。此类修改将包括 DeferRefresh,它本质上是一个 Disposable,用于批量修改 View 。

据我所知,您遇到的问题是 DataGrid 处于事务的中间,或者 View 设置为相信它,而您正在更改 ItemsSource (这将更改或完全替换关联的绑定(bind) View )。您正在清除一个单元格但它尚未修改基础数据意味着它已开始编辑 (BeginEdit),但尚未提交 (CommitEdit),这在您默认更改单元格时发生。

当您关闭和重新打开窗口时会发生这种情况,这意味着保留了一些保留的状态,仍然认为交易正在进行中。也许它仍然使用与以前相同的 ListCollectionView,并且仍然将 IsEditingItem 设置为 true?

该修复最有可能确保在关闭窗口之前提交所有编辑。

关于WPF DataGrid ItemsSource 绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223998/

相关文章:

Silverlight Datagrid 行单击

java - Hazelcast 中所有 map 的编程属性设置?

c# - OpenGL 尝试绘制多个 2d 纹理,只出现第一个

php - 从 PHP 中的自定义错误处理程序中抛出异常

wpf - DataGrid SelectionUnit=Cell 禁用对选定行的所有支持?

Java Web 服务 - 错误服务 - ClassNotFound 异常

c++ - what() 不抛出(异常类)重要吗?

c# - 使用 C# 和 WPF 将数据从 SQLite 绑定(bind)到 DataGrid

WPF RoutedEvent(通过 EventManager.RegisterClassHandler)

c# - 您如何设置单个 TextBox 的样式?