如何更新ListCollectionView?

23 浏览
0 Comments

如何更新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 { 1,2,3 };

_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();

0
0 Comments

问题的原因是无法向数组中添加元素,因为数组是固定大小的。解决方法是将toadd的类型更改为List<T>或实现了IList接口并提供了Add方法的其他集合类型。

另外,建议直接修改ObservableCollection,而不是使用ListCollectionViewListCollectionView是在绑定到源集合时框架自动生成的集合视图。详情请参考文档

以下是整理后的文章:

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

0