在AddNew或EditItem事务期间不允许使用DeferRefresh'

时间:2015-09-28 11:33:28

标签: wpf

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

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

//我的排序代码

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


}

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

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

要解决此问题,您可以在CustomObservableCollection上实现挂起集合上的更改事件的所有控件,而不是在CollectionView中使用DeferRefresh功能,以便通过Begin / End Update调用执行批量更改操作(似乎是某些事情)类似于VS2015 https://msdn.microsoft.com/en-us/library/dd867973.aspx)或只是谷歌&#34;批量批量更新可观察集合&#34;对于您自己的INotifyCollectionChanged的自定义实现。

顺便说一下,如果你有钱花钱,很多第三方wpf控制包,例如DevExpress,在其控件上附带Begin / EndDateUpdate。将节省大量时间来实施您自己的解决方案。

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