首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在AddNew或EditItem事务mvvm期间不允许使用WPF DataGrid‘刷新’

在AddNew或EditItem事务mvvm期间不允许使用WPF DataGrid‘刷新’
EN

Stack Overflow用户
提问于 2013-11-26 06:22:07
回答 3查看 16.4K关注 0票数 11

我有下面的表格

代码语言:javascript
复制
    <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,然后调用

代码语言:javascript
复制
this.FilteredModels.View.Refresh();

当用户选中几个复选框并将网格发送到编辑模式,然后执行搜索时,我们会得到以下错误

代码语言:javascript
复制
WPF DataGrid 'Refresh' is not allowed during an AddNew or EditItem transaction

有没有办法强制网格退出编辑模式,当一个复选框被选中,甚至当搜索按钮被点击时,或者其他一些解决方法?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-15 21:26:15

我知道对于一个正在寻找答案的人来说,answer...but为时已晚

在类似下面的序列中使用cancelEdit或commitEdit方法两次

//表示提交

代码语言:javascript
复制
this.datagrid_layers.CommitEdit();
this.datagrid_layers.CommitEdit();

//表示取消

代码语言:javascript
复制
this.datagrid_layers.CancelEdit();
this.datagrid_layers.CancelEdit();
票数 39
EN

Stack Overflow用户

发布于 2013-11-26 07:52:48

您应该能够将所选项目强制转换为IEditableObject并对其调用EndEdit,或者调用网格的CancelEdit方法。

票数 4
EN

Stack Overflow用户

发布于 2019-11-08 23:22:50

有一个干净的MVVM解决方案来解决这个问题。首先,您的ViewModels必须实现IEditableObject接口(无操作就足够了)。然而,这还不够,因为DataGrid不会侦听IEditableObject.CancelEdit

另一个问题是,ICollectionView和IEditableCollectionView都没有实现另一个。虽然只有ICollectionView可以刷新,但只有IEditableCollectionView可以提交/取消。幸运的是,CollectionViewSource.GetDefaultView返回的集合视图实现了

代码语言:javascript
复制
// 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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20204592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档