我有以下网格
<DataGrid
x:Name="TablesDataGrid"
Grid.Column="0"
Grid.Row="1"
ItemsSource="{Binding FilteredModels.View}"
AlternationCount="2"
AutoGenerateColumns="False"
CanUserSortColumns="True"
CanUserReorderColumns="False"
CanUserDeleteRows="False"
CanUserAddRows="False"
SelectionMode="Extended"
IsReadOnly="False"
SelectionUnit="FullRow"
RowHeight="25"
HorizontalAlignment="Stretch"
ColumnWidth="Auto">
<DataGrid.Columns >
<DataGridCheckBoxColumn Width="*" Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsReadOnly="False">
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CheckAll}"/>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>
<DataGridTextColumn Header="Source Table" Binding="{Binding SourceTableFullName}" Width="4*"></DataGridTextColumn>
<DataGridTextColumn Header="EDW Schema" Binding="{Binding SchemaName}" Width="2*"></DataGridTextColumn>
<DataGridTextColumn Header="EDW Table" Binding="{Binding TableName}" Width="4*"></DataGridTextColumn>
<DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="*"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
然后我有一个 searchCommand 对视图模型中的 collectionViewSource FilteredModels 执行搜索,然后调用
this.FilteredModels.View.Refresh();
当用户选中一些复选框并将网格发送到编辑模式,然后执行搜索时,我们会收到以下错误
WPF DataGrid 'Refresh' is not allowed during an AddNew or EditItem transaction
有没有办法在选中复选框时强制网格退出编辑模式,甚至单击搜索按钮或其他修复方法?
谢谢!
我知道现在回答已经太晚了...但对于正在寻找答案的人来说
按如下顺序使用 cancelEdit 或 commitEdit 方法两次
//用于提交
this.datagrid_layers.CommitEdit();
this.datagrid_layers.CommitEdit();
//取消
this.datagrid_layers.CancelEdit();
this.datagrid_layers.CancelEdit();
有一个干净的 MVVM 解决方案可以解决这个问题。首先,您的 ViewModel 必须实现
IEditableObject
接口(无操作就足够了)。然而,这还不够,因为 DataGrid
不会听 IEditableObject.CancelEdit
。 ICollectionView
可以刷新,但只有 IEditableCollectionView
可以提交/取消。幸运的是,CollectionViewSource.GetDefaultView
返回的集合视图实现了both:
// ViewModel.cs
public class ItemVM : IEditableObject, INotifyPropertyChanged { }
public class ModuleVM : INotifyPropertyChanged {
ICollectionView Items { get; }
public ModuleVM(ObservableCollection<ItemVM> items) {
Items = CollectionViewSource.GetDefaultView(items);
}
public void RefreshSafely() {
((IEditableCollectionView)Items).CancelEdit(); // alterantively, CommitEdit()
Items.Refresh();
}
}
或者换句话说,您可以将
ICollectionView
投射到 IEditableCollectionView
并先调用 CancelEdit()
。
您应该能够将所选项目转换为 IEditableObject 并对其调用 EndEdit,或调用网格 CancelEdit 方法。
这是我的解决方案,请根据您的需要进行调整。
private void CommitEditRefreshViewSafely()
{
((IEditableCollectionView)MyCollectionViewList.View).CommitEdit();
MyCollectionViewList.View.Refresh();
}