我正在点击按钮点击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
}
任何人都可以帮助我吗?
答案 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;。它适用于排序或分组,因为无论如何都需要重新渲染。但是,对于一次更新一些单元格或行的操作可能不是这样。您需要自己测试性能,以找出哪种情况更好。