【问题标题】:DeferRefresh' is not allowed during an AddNew or EditItem transaction在 AddNew 或 EditItem 事务期间不允许 DeferRefresh'
【发布时间】:2015-09-28 11:33:27
【问题描述】:

我在 WPF 中点击按钮并使用拖放技术进行排序 当我在 WPF 中拖动 dll 文件,然后再次单击按钮进行排序时。

AddNew 或 EditItem 事务期间不允许出现DeferRefresh 错误。

//我的排序代码

if (_sortColumn == column)
        {

            _sortColumn = column;

            downImage = @"..\Images\icon-arrow-up-b-128.png";

            NotifyOfPropertyChange(() => FilesView);

                _filesCollectionViewSource.SortDescriptions.Add(new SortDescription(_sortColumn, System.ComponentModel.ListSortDirection.Ascending));
                NotifyOfPropertyChange(() => DisplayedImageDown);
                _filesCollectionViewSource.SortDescriptions.Clear();
                _sortColumn = "";
    }
}

//我的拖拽代码

        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        List<string> fileList = new List<string>(files);
        List<string> filepaths = new List<string>();
        foreach (var file in (string[])e.Data.GetData(DataFormats.FileDrop, false))
        {
            FileInfo fi = new FileInfo(file);
            Console.WriteLine(fi.Name);
            long byteSize = fi.Length;
            //string stringSize = BytesToString(byteSize);
            string name = fi.Name;

            ListView listView = sender as ListView;

           ((ListCollectionView)FilesView.ItemsSource).AddNewItem((new FileViewModel(@"" + fi.DirectoryName + "/" + name)));//, itemSize = stringSize


}

谁能帮帮我?

【问题讨论】:

标签: wpf


【解决方案1】:

您只能使用 DeferRefresh() 来更改排序/组描述。我听说 .NET 4.5 中进行了一些更改,但我还没有测试过。

为了解决这个问题,您可以在您的 CustomObservableCollection 中实现所有控件,而不是使用 CollectionView 中的 DeferRefresh 功能,该控件暂停集合上的更改事件,以便通过 Begin/End Update 调用执行批量更改操作(看起来像VS2015 https://msdn.microsoft.com/en-us/library/dd867973.aspx 也有类似的功能,或者只是为您自己的 INotifyCollectionChanged 自定义实现谷歌“批量更新可观察集合”。

顺便说一句,如果你有钱可以花,很多 3rd 方 wpf 控件包,例如DevExpress,在他们的控件上带有 Begin/EndDateUpdate。将节省您实施自己的解决方案的大量时间。

使用开始/结束更新的一个注意事项是,并非所有批量更新操作都有性能提升。这个想法主要是“做任何你想做的事情,然后控件将进行整个数据收集刷新”。它适用于排序或分组,因为无论如何都需要重新渲染。但是,对于一次更新几个单元格或行的操作可能并非如此。您需要自行测试性能,以确定哪种情况更好。

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2013-11-30
    相关资源
    最近更新 更多