此视图不允许 CommitNew
CommitNew is not allowed for this View
我有一个 WPF 数据网格,其中一列是嵌套的数据网格:
<DataGridTemplateColumn Header="Description" Width="{Binding DataContext.ColWidths[5].Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding oDesc}" AutoGenerateColumns="False"
SelectedItem="{Binding CurrentDesc, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PreviewMouseDoubleClick="DataGrid_PreviewMouseDoubleClick" CellStyle="{DynamicResource EmbeddedDataGridCellStyle}">
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<EventSetter Event="PreviewMouseDoubleClick" Handler="DataGrid_PreviewMouseDoubleClick"></EventSetter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding RepNumber, Mode=OneWay}" Width="15"/>
<DataGridTextColumn Header=" " Binding="{Binding Description1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*" >
<DataGridTextColumn.ElementStyle>
<Style>
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="SpellCheck.IsEnabled" Value="True"/>
<Setter Property="AcceptsReturn" Value="True"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowEditEnding">
<i:InvokeCommandAction Command="{Binding DataContext.DescRowEditEnding, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</i:EventTrigger>
<i:EventTrigger EventName="PreviewMouseDoubleClick">
<i:InvokeCommandAction Command="{Binding DataContext.GridDoubleClick, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我从
收到异常(Sytem.InvalidOperationException:此视图不允许 CommitNew)
System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.CommitNew()
调用自
System.Windows.Controls.DataGrid.CommitRowItem()
我的代码的 None 在堆栈中(它引用回 App.g.cs 文件中我的 app.Run 命令)。更改已更新到数据库,因此它发生在我的 ViewModels RowEditEnding 处理程序中的 SubmitChanges() 调用之后。
我找到的关于此错误的唯一参考资料 (here) 告诉我我的 CellTemplate 覆盖可能把它搞砸了,所以我将默认 celltemplate 样式的副本添加到我的应用程序资源并将其用于两个数据网格都无济于事。
我不知道如何着手追踪这里发生的事情。有没有人处理过这个?我还要补充一点,随着数据库的增长,这个问题似乎越来越严重。当我最初部署它并且数据库中的项目很少时,它似乎从未发生过。
解决方案:我的视图模型具有也使用 CollectionViewSource 的 ObservableCollections(我称它们为 ViewSourceCollections,它继承自 ObservableCollection 并具有 ListCollectionView 成员)。这为我提供了 ObservableCollections 真正不提供的所有内置排序、分组和过滤功能。因此,下面@PrashantManjule 提出的解决方案可以以更简单的形式轻松测试:
myViewSourceCollection.View.MoveCurrentToFirst();
在 RowEditEnding 中。一旦我在各自的数据网格 RowEditEnding 处理程序中对主集合和子集合都执行了此操作,问题就消失了。我仍然不知道为什么这会起作用,而且随着时间的推移,这种情况开始越来越频繁地发生,直到最后任何编辑都会导致异常(和崩溃)。
这个错误我遇到过3次
case1 : 如果双击数据网格则显示此错误(包含分析等处理数据的自定义数据网格)
简单,在Datagrid中设置IsReadOnly="True"
case2:编辑数据网格后显示此错误,必须在 RowEditEnding
期间设置
(sender as DataGrid).CommitEdit(DataGridEditingUnit.Row);
case3 :此错误在 RowEditEnding 事件后显示,然后必须查看 datagrid 在哪里重新加载数据,如果 viewsource 或 datagrid 已在使用并且我们尝试手动覆盖数据
如果您看到任何新病例,请告诉我
@PrashantManjule 给出了答案,但后来被编辑为不正确。我为解决问题所做的工作:
在我的视图模型 RowEditEnding 处理程序中:
ViewSourceCollection.View.MoveCurrentToFirst();
作为处理程序的最后一个操作。 RowEditEnding 处理程序中的数据库更新始终正常工作,但这似乎修复了我遇到的 UI 异常。
我有一个 WPF 数据网格,其中一列是嵌套的数据网格:
<DataGridTemplateColumn Header="Description" Width="{Binding DataContext.ColWidths[5].Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding oDesc}" AutoGenerateColumns="False"
SelectedItem="{Binding CurrentDesc, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PreviewMouseDoubleClick="DataGrid_PreviewMouseDoubleClick" CellStyle="{DynamicResource EmbeddedDataGridCellStyle}">
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<EventSetter Event="PreviewMouseDoubleClick" Handler="DataGrid_PreviewMouseDoubleClick"></EventSetter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding RepNumber, Mode=OneWay}" Width="15"/>
<DataGridTextColumn Header=" " Binding="{Binding Description1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*" >
<DataGridTextColumn.ElementStyle>
<Style>
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="SpellCheck.IsEnabled" Value="True"/>
<Setter Property="AcceptsReturn" Value="True"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowEditEnding">
<i:InvokeCommandAction Command="{Binding DataContext.DescRowEditEnding, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</i:EventTrigger>
<i:EventTrigger EventName="PreviewMouseDoubleClick">
<i:InvokeCommandAction Command="{Binding DataContext.GridDoubleClick, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我从
收到异常(Sytem.InvalidOperationException:此视图不允许 CommitNew)System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.CommitNew()
调用自
System.Windows.Controls.DataGrid.CommitRowItem()
我的代码的 None 在堆栈中(它引用回 App.g.cs 文件中我的 app.Run 命令)。更改已更新到数据库,因此它发生在我的 ViewModels RowEditEnding 处理程序中的 SubmitChanges() 调用之后。
我找到的关于此错误的唯一参考资料 (here) 告诉我我的 CellTemplate 覆盖可能把它搞砸了,所以我将默认 celltemplate 样式的副本添加到我的应用程序资源并将其用于两个数据网格都无济于事。
我不知道如何着手追踪这里发生的事情。有没有人处理过这个?我还要补充一点,随着数据库的增长,这个问题似乎越来越严重。当我最初部署它并且数据库中的项目很少时,它似乎从未发生过。
解决方案:我的视图模型具有也使用 CollectionViewSource 的 ObservableCollections(我称它们为 ViewSourceCollections,它继承自 ObservableCollection 并具有 ListCollectionView 成员)。这为我提供了 ObservableCollections 真正不提供的所有内置排序、分组和过滤功能。因此,下面@PrashantManjule 提出的解决方案可以以更简单的形式轻松测试:
myViewSourceCollection.View.MoveCurrentToFirst();
在 RowEditEnding 中。一旦我在各自的数据网格 RowEditEnding 处理程序中对主集合和子集合都执行了此操作,问题就消失了。我仍然不知道为什么这会起作用,而且随着时间的推移,这种情况开始越来越频繁地发生,直到最后任何编辑都会导致异常(和崩溃)。
这个错误我遇到过3次
case1 : 如果双击数据网格则显示此错误(包含分析等处理数据的自定义数据网格)
简单,在Datagrid中设置IsReadOnly="True"
case2:编辑数据网格后显示此错误,必须在 RowEditEnding
期间设置 (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row);
case3 :此错误在 RowEditEnding 事件后显示,然后必须查看 datagrid 在哪里重新加载数据,如果 viewsource 或 datagrid 已在使用并且我们尝试手动覆盖数据
如果您看到任何新病例,请告诉我
@PrashantManjule 给出了答案,但后来被编辑为不正确。我为解决问题所做的工作:
在我的视图模型 RowEditEnding 处理程序中:
ViewSourceCollection.View.MoveCurrentToFirst();
作为处理程序的最后一个操作。 RowEditEnding 处理程序中的数据库更新始终正常工作,但这似乎修复了我遇到的 UI 异常。