如何更新ListCollectionView?
如何更新ListCollectionView?
上下文是我想在View中暴露一个来自ViewModel的ListCollectionView给ListView;ViewModel会较慢地更新一个ObservableCollection(需要几秒钟来填充集合)。
因此,我想在ObservableCollection更新后更新ListCollectionView的方式如下:
MyObservableCollection.CollectionChanged += CollectionChanged;
private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
MyListCollectionView.AddNewItem(e.NewItems);
MyListCollectionView.CommitNew();
}
我尝试更新ListCollectionView,但即使是使用List<>也失败了。我该怎么做?
[TestClass]
public class ListViewTests
{
private ListCollectionView _sut;
[TestInitialize]
public void Setup()
{
var toadd = new List
_sut = new ListCollectionView(toadd);
}
[TestMethod]
public void AddItem()
{
var toadd = new List
_sut.AddNewItem(toadd);
_sut.CommitNew();
}
}
引发异常:
System.InvalidOperationException: 该视图不允许使用'AddNewItem'方法。
关于如何更新ObservableCollection的更多细节:
Parallel.ForEach(ShTiffFiles, file =>
{
var sht = new ShutterTiff(file, _aesService); // 缓慢的(小型Model)
var shtv = new ShutterTiffVignette(sht, _fastCache); // 缓慢的(小型ViewModel)
lock (_o) // 使其线程安全
{
Application.Current.Dispatcher.Invoke(() =>
{
ShutterTiffObservableCollection.Add(shtv);
});
}
});
在ViewModel中:
private object _o = new object();
问题的原因是无法向数组中添加元素,因为数组是固定大小的。解决方法是将toadd
的类型更改为List<T>
或实现了IList
接口并提供了Add
方法的其他集合类型。
另外,建议直接修改ObservableCollection
,而不是使用ListCollectionView
。ListCollectionView
是在绑定到源集合时框架自动生成的集合视图。详情请参考文档。
以下是整理后的文章:
在Setup()
方法中,将toadd
的类型更改为List<T>
或实现了IList
接口并提供了Add
方法的其他集合类型:
为什么System.Array类实现了IList但没有提供Add()方法
无法向数组中添加元素。
不清楚您的测试应该做什么?验证内置的ListCollectionView
类型的功能吗?您应该专注于测试您的代码,而不是测试框架类型。
*最终,我想在更新ObservableCollection后更新ListCollectionView。
然后将ObservableCollection
包装起来:
_sut = new ListCollectionView(observableCollection);
或者直接修改ObservableCollection
。在这里似乎不需要使用ListCollectionView
。集合视图是当绑定到源集合时框架为您创建的。有关更多信息,请参阅文档。
我真的很喜欢您的答案。从中学到了很多。也许她只是想在框架中做一些新的“事物”的试验,而不是进行实际测试。
:也许。这就是为什么我写了“不清楚”。
-MathieuPrévot:在Setup()
方法中,ListCollectionView
对数组进行了包装。我编辑了我的答案以澄清这一点,因为测试方法中也有一个toadd
。