我有下面的表格
<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>然后,我有一个在视图模型中的collectionViewSource FilteredModels上执行搜索的seachCommand,然后调用
this.FilteredModels.View.Refresh();当用户选中几个复选框并将网格发送到编辑模式,然后执行搜索时,我们会得到以下错误
WPF DataGrid 'Refresh' is not allowed during an AddNew or EditItem transaction有没有办法强制网格退出编辑模式,当一个复选框被选中,甚至当搜索按钮被点击时,或者其他一些解决方法?
谢谢!
发布于 2015-02-15 21:26:15
我知道对于一个正在寻找答案的人来说,answer...but为时已晚
在类似下面的序列中使用cancelEdit或commitEdit方法两次
//表示提交
this.datagrid_layers.CommitEdit();
this.datagrid_layers.CommitEdit();//表示取消
this.datagrid_layers.CancelEdit();
this.datagrid_layers.CancelEdit();发布于 2013-11-26 07:52:48
您应该能够将所选项目强制转换为IEditableObject并对其调用EndEdit,或者调用网格的CancelEdit方法。
发布于 2019-11-08 23:22:50
有一个干净的MVVM解决方案来解决这个问题。首先,您的ViewModels必须实现IEditableObject接口(无操作就足够了)。然而,这还不够,因为DataGrid不会侦听IEditableObject.CancelEdit。
另一个问题是,ICollectionView和IEditableCollectionView都没有实现另一个。虽然只有ICollectionView可以刷新,但只有IEditableCollectionView可以提交/取消。幸运的是,CollectionViewSource.GetDefaultView返回的集合视图实现了和
// 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()。
https://stackoverflow.com/questions/20204592
复制相似问题