WPF DataGrid ItemsSource绑定问题

我有一个WPF应用程序中的DataGrid,它将自身绑定到ObservableCollection对象,并且一切正常。 现在,如果我在运行时修改数据网格中的单元格并删除内容,请将单元格留空。 observableCollection的相应值不会被修改,它会是旧值。 但是,当我退出包含datagrid的窗口并重新启动窗口时,它会抛出一个XamlParseException,说:“Set Property'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:VOTrunkVO3Start.xaml:line 1
       at VO3.Start..ctor() in C:VOTrunkVO3Start.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: 

只要当我关闭窗口时,它不会抛出异常,数据网格中的单元格不为空。 我还在窗口初始化组件行前检查了集合,它看起来非常好,所有对象都有正确的值,没有空或空值。 我无法弄清楚它为什么抛出这个异常。 有任何想法吗? 提前致谢。

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出现了相当多的问题。 这里有两个相关的帖子:

通用建议似乎是将DataGrid的关联视图作为IEditableCollectionView进行检查(默认情况下,因为ObservableCollection在绑定期间获取ListCollectionView时最后一次查看),并检查IsAddingNew和IsEditingItem以查看修改视图是否安全。 这样的修改将包括DeferRefresh,它本质上是一次性的,用于批量修改视图。

据我所见,你遇到的问题是DataGrid在事务的中途,或者视图被设置为相信它,而你正在改变ItemsSource(这将改变或完全替换相关的绑定视图)。 您正在清除单元格,但尚未修改底层数据意味着它已开始编辑(BeginEdit),但尚未提交(CommitEdit),默认情况下会更改单元格时发生此问题。

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

此修复最有可能确保在关闭窗口之前进行所有编辑。


如果您正在消隐的字段不是字符串类型,则可能无法正确更新。

例如,如果它是一个“int”,并且你将该单元格消隐,那么viewmodel的“int”属性将不会被设置。

我已经解决了这个问题的方法是将转换器的空白值转换为零。

希望这可以帮助

链接地址: http://www.djcxy.com/p/5171.html

上一篇: WPF DataGrid ItemsSource Binding Issue

下一篇: Display the username in a column